进程间通信-FIFI(命名管道)



与无名管道不同,FIFO可用于无关系的进程之间
1.管道读写端操作,如果读写端有一方读或写没打开,则另一端阻塞直到打开(非阻塞情况下会成功打开)
2.如果管道buf满了没有剩余空间,则写端会阻塞直到管道有pipe_buf的空间(如果管道是以非阻塞打开的,则空间满了继续写那么出错返回)
3.读段会一直阻塞直到写端向读端写入数据(非阻塞情况下出错返回)
4.多个读段去读,如果读的buf<PIPE_BUF则读取操作时原子操作,如果buf>PIPE_BUF则读取操作是非原子的,读取出来的数据是混乱的

直至最后一个访问管道的进程结束,内存里的管道数据会被删除,但是管道还在

int main()
{
	FILE 					* b_fd;
	int	   					  b_ret, b_num = 0;
	char					* b_fifo_name = "/tmp/fifo";
	pid_t					  b_pid[10];
	unlink(b_fifo_name);
	b_ret = mkfifo(b_fifo_name, 0777);
	if(b_ret < 0)
	{
		printf("mkfifo fail line = %d, fun = %s, file = %s", __LINE__, __func__, __FILE__);
		return -1;
	}

	b_pid[b_num] = fork();
	if(b_pid[b_num] < 0)
	{
		return -1;
	}
	if(0 == b_pid[b_num])
	{
		/*子线程*/
		ipc_pipe_fun1();
	}
	b_num++;

	b_pid[b_num] = fork();
	if(b_pid[b_num] < 0)
	{
		return -1;
	}
	if(0 == b_pid[b_num])
	{
		/*子线程*/
		ipc_pipe_fun1();
	}
	b_num++;

	b_pid[b_num] = fork();
	if(b_pid[b_num] < 0)
	{
		return -1;
	}
	if(0 == b_pid[b_num])
	{
		/*子线程*/
		ipc_pipe_fun2();
	}
	b_num++;

	while(1)
	{
		sleep(10000);
	}
	return 0;
}


int ipc_pipe_fun1()
{
	int 	  b_ret = 0, b_ttl = 0;
	char	  b_buf[4098];
	int		  b_fd = open("/tmp/fifo", O_RDONLY|O_NONBLOCK);

	
	while(1)
	{
		memset(b_buf, 0, sizeof(b_buf));
		b_ret = read(b_fd, b_buf, 100);
		printf("b_ret = %d, b_buf = %s\n", b_ret, b_buf);
	}
	
	return 0;
}

int ipc_pipe_fun2()
{
	int 	b_ret;
	char	b_buf[100];
	int		b_num = 0, b_len = 0, b_ttl = 0;
	char  * b_mall = (char *)malloc(65535);
	int		b_fd = open("/tmp/fifo", O_WRONLY|O_NONBLOCK);
	
	while(1)
	{
		memset(b_buf, 0, sizeof(b_buf));
		sprintf(b_buf, "%d|", b_num);
		b_num = (++b_num)%1000000;
		printf("==================\n");
		b_len = write(b_fd, b_buf, 100);
		b_ttl += b_len;
		printf("b_ttl = %d, b_len = %d, b_buf = %s\n", b_ttl, b_len, b_buf);
	}
	
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值