博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux进程的管道通信
阅读量:4559 次
发布时间:2019-06-08

本文共 1955 字,大约阅读时间需要 6 分钟。

linux进程的管道通信

要求

编程实现进程的管道通信,掌握管道通信的同步和互斥机制。

相关函数

  • pipe管道

    指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;而接受管道输出的接收进程(即读进程),则从管道中接收(读)数据。由于发送进程和接收进程是利用管道进行通信的,故又称为管道通信。这种方式首创于UNIX系统,由于它能有效地传送大量数据,因而又被引入到许多其它操作系统中。
    为了协调双方的通信,管道机制必须提供以下三方面的协调能力:
    1).互斥,即当一个进程正在对pipe执行读/写操作时,其它(另一)进程必须等待。
    2).同步,指当写(输入)进程把一定数量(如4KB)的数据写入pipe,便去睡眠等待,直到读(输出)进程取走数据后,再把他唤醒。当读进程读一空pipe时,也应睡眠等待,直至写进程将数据写入管道后,才将之唤醒。
    3).确定对方是否存在,只有确定了对方已存在时,才能进行通信。

  • fork()函数

    创建的子进程是fork调用者进程(即父进程)的复制品,除了进程标识数以及与进程特性有关的一些参数外,其他都与父进程相同,与父进程共享文本段和打开的文件,并都受进程调度程序的调度.
    如果创建进程失败,则fork()返回值为-1,若创建成功,则从父进程返回值是子进程号,从子进程返回的值是0

  • 互锁

    lockf(files,function,size):用于锁定文件的某些段或整个文件。本函数适用的头文件为:#include<unistd.h>,
    参数定义:int lockf(files,function,size)
    int files,founction;
    long size;
    files 是文件描述符,function表示锁状态,1表示锁定,0表示解锁;size是锁定或解锁的字节数,若为0则表示从文件的当前位置到文件尾。

流程图

1029215-20171208125612421-253846294.png

实现

#include
#include
#include
#include
#include
int main(){ pid_t pid1,pid2; int fd[2]; char out_pip[100],in_pip[100]; pipe(fd); while((pid1=fork())==-1); if(pid1==0)//pid1 { lockf(fd[1],1,0); sprintf(out_pip,"process 1 is sending message.\n"); write(fd[1],out_pip,50); sleep(1); lockf(fd[1],0,0); exit(0); } else { while((pid2=fork())==-1); if(pid2==0)//pid2 { lockf(fd[1],1,0); sprintf(out_pip,"process 2 is sending message.\n"); write(fd[1],out_pip,50); sleep(1); lockf(fd[1],0,0); exit(0); } else// main process { wait(0); read(fd[0],in_pip,50); printf("read:%s\n",in_pip); wait(0); read(fd[0],in_pip,50); printf("read:%s\n",in_pip); exit(0); } } return 0;}

结果

打印出两个子进程分别写入的结果

1029215-20171208125943921-157782545.png

转载于:https://www.cnblogs.com/yueshangzuo/p/8004895.html

你可能感兴趣的文章
LeetCode Maximum Subarray
查看>>
让我们再聊聊浏览器资源加载优化
查看>>
underscore demo
查看>>
CSS hack
查看>>
C# Enum Name String Description之间的相互转换
查看>>
PHP wamp server问题
查看>>
Spring Data Redis学习
查看>>
js闭包理解案例-解决for循环为元素注册事件的问题
查看>>
2015.04.23,外语,读书笔记-《Word Power Made Easy》 12 “如何奉承朋友” SESSION 33
查看>>
Spring+SpringMVC+JDBC实现登录
查看>>
生与死之间
查看>>
NEFU 109
查看>>
HDU 5435
查看>>
git从已有分支拉新分支开发
查看>>
滚动条隐藏兼容写法
查看>>
SQL2005查询所有表的大小
查看>>
Shell 正则表达式
查看>>
Docker run命令参数整理
查看>>
qt-opencv配置mingw编译器
查看>>
CSS之Medial Queries的另一用法:实现IE hack的方法
查看>>