进程间的通讯之有名管道

   有名管道在内存中开辟一块新的空间,2个进程通过文件描述符操作这片空间,可以再任意两个进程间传递数据。仅仅是目 录树中的一个标示, 并不在磁盘上空间。
   那么如何创建一个管道文件,有2个方式,一个使用mkfifo命令创建另一个是在程序中用mkfifo()函数创建。
   如何使用管道文件,和普通文件一样,使用open,read,write,close函数操作。
   但是和其他文件不同,主要有以下四点。
   1.如果一个进程以只写打开管道, 但是没有以只读或读写打开这个管道的进程, 则打开操作会阻塞, 直到有进程以读或读写打开, open 才会返回。
   2.如果一个进程以只读打开管道, 但是没有以只写或读写打开这个管道的进程, 则打开操作会阻塞, 直到有进程以写或读写打开, open 才会返回。
   3.当写端没有写入数据时, 读端会阻塞到 read 调用, 直到写端写入数据或者写端关闭。
   4.当管道没有空间时, 再写入数据就会被阻塞。 直到有进程读取数据, 或者所有的读端关闭。
   那么下面是例子,A程序接受用户输入的字符串,以end结束,之后传递给B程序,B程序计算一共有多少字符,end不计数。

这个是A程序。

#include<string.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>

void main()
{

   char cmd[1024] = {0};
   char p[] = "end"; 
   while(strstr(cmd,p) ==0)
   { 
      gets(cmd);
  }

     int fw = open("./FIFO",O_WRONLY);
     printf("open sucess\n");
     write(fw,&cmd,strlen(cmd));
     printf("write sucess\n");

     close(fw);
}

这个是B程序

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>

//  read
//


void main()
{
    int fd =  open("FIFO",O_RDONLY);
    int count = 0;
    char buf[1024] = {0};


    read(fd,buf,1024);


   printf("%d\n",strlen(buf)-3);

   close(fd);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值