Linux:IPC进程间通信,管道 ,FIFO文件。

目录

一:使用管道进行进程间通信

1.1:管道

1.2:pipe函数创建管

二:使用FIFO文件进行进程间通信


进程间通信,必须通过内核。

一:使用管道进行进程间通信

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文件就可以进行读写了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值