Liunx系统编程--进程通信,无名通信(一)

Liunx系统编程–进程通信(一),创建无名管道

IPC

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息,方式通常

有管道(无名管道和命名管道),信号量,消息队列,共享存储,Socket,Streams等。其中Socket,Streams支持不同主机上的两个进程IPC。

在这里插入图片描述

管道通信原理

1.管道,通常是指无名管道,是UNIX系统IPC最古老的形式,通常有以下特点

  • 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。

  • 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。

  • 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

  • 管道中的数据被读走就没了(不存储数据)

构建原理

 #include <unistd.h>
 int pipe(int fd[2]); 
// 返回值:若成功返回0,失败返回-1

当一个管道建立时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开。管道的建立存在与内核之中,关闭管道只需要将文件描述符关闭即可。

在这里插入图片描述
在这里插入图片描述

例子

//父进程写hello father,子进程读取出来
# include <stdio.h>
# include <unistd.h>
# include <stdlib.h>
# include <string.h>
int main ()
{
    int fd[2];
   // int pipe(int fd[2]);
        pid_t pid;
    char readbuf[128];
    if(pipe(fd)==-1)//创建管道
        printf("管道创建失败\n");
    else
        printf("管道创建成功\n");
    pid=fork();//创建进程
    if(pid<0)
        printf("创建进程失败");
    if(pid>0)
    {
        sleep(3);
        printf("进入父进程\n");
        close(fd[0]);
        write(fd[1],"hello from father",sizeof("hello from father"));
        wait();
    }
    if(pid==0)
  	{
        printf("进入子进程\n");
        close(fd[1]);
        read(fd[0],readbuf,128);//如果管道没有数据,就会在这里堵塞,等待父进程>写完后,在读取管道的信息
        printf("read form father:%s\n",readbuf);
        exit(0);
    }
    return 0;
}
//结果
xin@xin-virtual-machine:~/桌面/linkr/进程间通信$ ./a.out 
管道创建成功
进入子进程
进入父进程
read form father:hello from father

nkr/进程间通信$ ./a.out
管道创建成功
进入子进程
进入父进程
read form father:hello from father


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值