进程间通信

进程间通信

进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在什么双方都可以访问的介质呢?进程的用户空间是相互独立的,一般而言是不能相互访问的,唯一的例外是共享内存区。但是,系统空间却是”公共场所“,所以内核显然可以提供这样的条件。除此之外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过”注册表“或其他数据库中的某些表项和记录交换信息。广义上这也是进程间通信的手段,但是一般都不把这算作”进程间通信“。

目的

数据传输:一个进程需要将它的数据发送给另一个进程。

资源共享:多个进程之间共享相同的资源。

通知事件:一个进程需要向另一个或另一组进程发送消息,通知他发生了某种事件(如进程终止时要通知父进程)。

进程控制:有些进程希望完全控制另一个进程的执行(如debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

主要分类

管道:匿名管道pipe,命名管道。

System V IPC:System V 消息队列,System V 共享内存,System V 信号量。

POSIX IPC:消息队列,共享内存,信号量,互斥量,条件变量,读写锁。

管道

管道是Unix中最古老的进程间通信的形式。

我们把从一个进程到另一个进程的一个数据流成为一个管道。


匿名管道

#include<unistd.h>

功能:创建一无名管道。

原型:int pipe(int fd[2]);

参数:fd:文件描述符数组,其中fd[0]表示读端,fd[1]表示写端

返回值:返回成功为0,失败返回错误码。


代码:从键盘读取数据,写入管道,读取管道,写到屏幕

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main(void){
int fds[2];
char buf[100];
int len;
if(pipe(fds) == -1){
perror("make pipe"),exit(1);
}
//read from stdin
while(fgets(buf,100,stdin)){
len  = strlen(buf);
//write into pipe
if(write(fds[1],buf,len) != len){
perror("write to pipe");
break;
}
memset(buf,0x00,sizeof(buf));
//read from pipe
if((len = read(fds[0],buf,100)) == -1){
perror("read from pipe");
break;
}
//write to stdout
if(write(1,buf,len) != len){
perror("write to stdout");
break;
}
}
}


猜你喜欢

转载自blog.csdn.net/qq_40995354/article/details/79993507