Linux环境编程之IPC进程间通信(四):管道和FIFO比较

本文介绍了管道和FIFO在系统中的限制,包括最大描述符数(OPEN_MAX)和可原子写入的最大数据量(PIPE_BUF),并通过示例代码展示了如何查询这些限制值。此外,还提供了两种将管道或FIFO设置为非阻塞模式的方法。

系统加于管道和FIFO的唯一限制是:

1、OPEN_MAX 一个进程在任意时刻打开的最大描述符数。可以通过调用sysconf函数查询。

2、PIPE_BUF 可原子地写往一个管道或FIFO的最大数据量。Posix任务它是一个路径名变量,它的值可以随指定的路径名而变化,因为不同的路径名可以落在不同文件系统上,而这些文件系统可能有不同的特征。所以PIPE_BUF可通过pathconf函数取得。

pipeconf.c

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

int
main(int argc, char **argv)
{
	if(argc != 2)
		printf("usage:pipeconf <pathname>");
	printf("PIPE_BUF = %ld, OPEN_MAX = %ld\n",
			pathconf(argv[1], _PC_PIPE_BUF), sysconf(_SC_OPEN_MAX));
	exit(0);
}
编译:gcc pipeconf.c -o pipeconf

运行:./pipeconf 

结果显示:PIPE_BUF = 4096, OPEN_MAX = 1024


对管道或FIFO能以两种方式设置成非阻塞:

1、调用open时可指定O_NONBLOCK标志。

writefd = open(FIFO1, O_WRONLY | O_NONBLOCK, 0);

2、如果一个描述符已经打开,可调用fcntl启用O_NONBLOCK标志。对于管道来说,必须使用这种技术,因为管道没哟open调用,在pipe调用中也无法指定O_NONBLOCK标志。使用fcntl时,先使用F_GETFL命令取得当前文件状态标志,将它与O_NONBLOCK标志按位或,再使用F_SETFL命令存储这些文件状态标志。

int  flags;

if((flags = fcntl(fd, F_GETFL, 0) < 0))
		err_sys("F_GETEFL error");
flags |= O_NONBLOCK;
if((flags = fcntl(fd, F_SETFL, 0) < 0))
		err_sys("F_SETEFL error");



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值