进程间通信(IPC)2 ------ 有名管道

      管道的一个不足之处是没有名字,因此只能在具有亲缘关系的进程之间通信。而“有名管道”与此不同,它提供了一个路径名与之关联,作为一个设备文件存在,即使无亲缘关系的进程之间,只要能访问该路径,也可以通过FIFO进行通信。FIFO总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出。

      函数原型:

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *path,mode_t mode);

      path为创建有名管道的路径名;mode为创建有名管道的模式,指明其存取权限。函数调用成功返回0,失败返回-1。

      使用一个存在的有名管道之前,需要用open()将其打开。因为有名管道是一个存在于硬盘上的文件,而管道是存在于内存中的特殊文件。

      以下程序演示有名管道在无亲缘关系的进程之间如何通信。

//procwriter.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

#define FIFO_NAME	"myfifo"
#define BUF_SIZE	1024

int main(void)
{
	int     fd;
	char	buf[BUF_SIZE] = "Hello procwrite, I come from process named procread!";

	umask(0);
	//指明创建一个有名管道且存取权限为0666,即创建者、与创建者同组的用户、其他用户对该有名管道的访问权限都是可读可写
	if (mkfifo (FIFO_NAME, S_IFIFO | 0666) == -1)		
	{
		perror ("mkfifo error!");
		exit (1);
	}

	if((fd = open (FIFO_NAME, O_WRONLY) ) == -1)/*以写方式打开FIFO*/
	{
		perror ("fopen error!");
		exit (1);
	}
	write (fd, buf, strlen(buf)+1); /*向FIFO写数据*/

	close (fd);
	exit (0);
}

procreader.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>

#define FIFO_NAME  	"myfifo"
#define BUF_SIZE    	1024

int main(void)
{
        int     fd;
        char    buf[BUF_SIZE];

        umask (0);
        fd = open(FIFO_NAME, O_RDONLY);
        read (fd, buf, BUF_SIZE);
        printf ("Read content: %s\n", buf);
        close (fd);
        exit (0);
}

      首先运行procwrite(运行后处于阻塞状态),打开另一个终端运行程序procread。结果如下:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值