Liunx C Pipe(无名管道)通信

Pipe(无名管道):

Pipe(无名管道)用于有缘进程间通信,父子进程或兄弟进程,调用pipe函数创建Pipe(无名管道),返回值为0,即成功,小于0,则失败,其传出参数为含有两个元素的数组,F[0]是管道的读端,F[1]是管道的写端,当父进程创建了子进程,子进程也会继承父进程的文件描述表,从而也指向同一文件表。

进程A和进程B可以是父子进程,亦可是兄弟进程

在这里插入图片描述

关闭未使用的文件描述符:

1 .当进程A为读,进程B为写的时候:
关闭进程A的写文件描述符4和进程B的读文件描述符3
2 .当进程A为写,进程B为读的时候:
关闭进程A的读文件描述符3,和进程B的写文件描述符4

下图为上述的第一种情况:

在这里插入图片描述

#define _GNU_SOURCE             
#include <fcntl.h>             
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
    int F[2];  //F[0]:read F[1]:write
	pid_t pid;
	char buf[1024];
    if(pipe(F)<0) exit(1);
	pid = fork(); //创建子进程
	if(pid>0) 
	{
		close(F[0]);
		printf("进程A:")
		scanf("%s",buf);
		write(F[1],buf,1024);
		wait(NULL); //等待子进程退出
	}
	else if(pid==0) 
	{
		close(F[1]);
		read(F[0],buf,1024);
		printf("进程B:%s\n",buf);
	}
	return 0;
}

父子进程间通信:

在这里插入图片描述

特殊点:

1 .读取进程未关闭写端,写入进程写完后,读取进程读完写入进程的数据后,依然还会阻塞,因为读入进程以为还有进程要写入。
2 .写入进程未关闭读端,其他进程已全部关闭读端,写入进程依旧能写入数据,直到写满管道,再写入的话,进程就会阻塞,直到管道有数据读出,才能解除阻塞。
3 .管道的读端计数为0(没有任何一个进程的文件描述符指向读端),当一个进程试图写入数据,内核将发送SIGPIPE信号,则会杀死该进程。(若SIGPIPE信号被捕获或忽略,则write函数会返回EPIPE错误)
4 . 管道的写端计数为0(没有任何一个进程的文件描述符指向写端),当一个进程试图读出数据,则读取进程就会像读完数据一样。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值