目录
进程间通信,必须通过内核。
一:使用管道进行进程间通信
1.1:管道
管道是一种最基本的IPC通信方式,他只适用于有血缘关系的进程间通信。父子进程和兄弟进程。对于两个不相干的进程间,不适用这种通信方式。
管道的读写是单项的,就像现实中的水管一样,一端给水(写),一端出水(读)。
1.2:pipe函数创建管
int pipe(int fd[2]);
成功调用函数后,fd[0]中存放的就是该管道读端的文件描述符,fd[1]中存放的就是该管道写端的文件描述符。(0读1写)。
那么创建好管道后,父子进程中都有管道的fd【1】和fd【0】两个文件描述符,我们规定其中一个进程读(关闭写端),另一个进程写(关闭读端)。实现代码如下
int main()
{
13 int ret = pipe(fd);
14 if(ret < 0)
15 {
16 perror("pipe error");
17 return -1;
18 }
19
20 //创建子进程
21 pid_t pid = fork();
22 if(pid < 0)
23 {
24 perror("fork error");
25 return -1;
26 }
27 else if(pid == 0)//子进程,读
28 {
29 //关闭读端
30 close(fd[0]);
31
32 write(fd[1] , "hello world" , strlen("hello world"));
33
34 // wait(NULL);//阻塞回收子进程资源
35 waitpid(-1 , NULL ,0);//阻塞回收子进程资源
36 }
37 else if( pid > 0 )//父进程读
38 {
39 //关闭写端
40 close(fd[1]);
41
42 char buf[64];
43 memset(buf , 0x00 , sizeof(buf));
44 read(fd[0] , buf , sizeof(buf));
45 printf("child read: [%s]\n",buf);
47 }
}
read函数在读管道文件时,如果文件中没有数据,read函数会自动阻塞等待数据写入后读取。
二:使用FIFO文件进行进程间通信
FIFO文件,可以让两个无血缘关系的进程进行通信。它本身只是一个标签,并不是一个真正的文件,但是在操作时,可以像操作普通文件那样读写。
在有进程往FIFO文件中写数据时,数据直接被写到内核缓冲区了。所以对FIFO文件不能使用lseek函数。 在进行进程间通信时,两个进程都打开同一个FIFO文件就可以进行读写了。