linux 进程间通信-有名管道编程

下面的实例包含了两个程序,一个用于读管道,另一个用于写管道。其中在读管道的程序里创建管道,并
且作为 main()函数里的参数由用户输入要写入的内容。读管道的程序会读出用户写入到管道的内容,这两
个程序采用的是阻塞式读写管道模式。
以下是写管道的程序:

/* fifo_write.c */ 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 
#define MYFIFO "/tmp/myfifo" /* 有名管道文件名*/ 
#define MAX_BUFFER_SIZE PIPE_BUF /*定义在于 limits.h 中*/ 
int main(int argc, char * argv[]) /*参数为即将写入的字符串*/ 
{ 
	 int fd; 
	 char buff[MAX_BUFFER_SIZE]; 
	 int nwrite; 
	 
	 if(argc <= 1) 
	 { 
		 printf("Usage: ./fifo_write string\n"); 
		 exit(1); 
	 } 
	 sscanf(argv[1], "%s", buff); 
	 
	 /* 以只写阻塞方式打开 FIFO 管道 */ 
	 fd = open(MYFIFO, O_WRONLY); 
	 if (fd == -1) 
	 { 
		 printf("Open fifo file error\n"); 
		 exit(1); 
	 }
	 /*向管道中写入字符串*/ 
	 if ((nwrite = write(fd, buff, MAX_BUFFER_SIZE)) > 0) 
	 { 
		 printf("Write '%s' to FIFO\n", buff); 
	 } 
	 close(fd); 
	 exit(0); 
}

以下是读管道程序:

/*fifo_read.c*/ 
(头文件和宏定义同 fifo_write.c)
int main() 
{ 
	 char buff[MAX_BUFFER_SIZE]; 
	 int fd; 
	 int nread; 
	 /* 判断有名管道是否已存在,若尚未创建,则以相应的权限创建*/ 
	 if (access(MYFIFO, F_OK) == -1) 
	 { 
		 if ((mkfifo(MYFIFO, 0666) < 0) && (errno != EEXIST)) 
		 { 
			 printf("Cannot create fifo file\n"); 
			 exit(1); 
		 } 
	 } 
	 /* 以只读阻塞方式打开有名管道 */ 
	 fd = open(MYFIFO, O_RDONLY); 
	 if (fd == -1) 
	 { 
		 printf("Open fifo file error\n"); 
		 exit(1); 
	 } 
	 
	 while (1) 
	 { 
		 memset(buff, 0, sizeof(buff)); 
		 if ((nread = read(fd, buff, MAX_BUFFER_SIZE)) > 0) 
		 { 
		 	printf("Read '%s' from FIFO\n", buff); 
		 } 
	} 
	close(fd); 
	exit(0); 
} 

为了能够较好地观察运行结果,需要把这两个程序分别在两个终端里运行,在这里首先启动读管道程序。
读管道进程在建立管道之后就开始循环地从管道里读出内容,如果没有数据可读,则一直阻塞到写管道进
程向管道写入数据。在启动了写管道程序后,读进程能够从管道里读出用户的输入内容,程序运行结果如
下所示。
终端一:

$ ./fifo_read
Read 'FIFO' from FIFO 
Read 'Test' from FIFO 
Read 'Program' from FIFO 

……
终端二:

$ ./fifo_write FIFO 
Write 'FIFO' to FIFO 
$ ./fifo_write Test 
Write 'Test' to FIFO 
$ ./fifo_write Program 
Write 'Program' to FIFO 

……

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值