linux进程的管道通信
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则表示从文件的当前位置到文件尾。
流程图

实现
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<sys/wait.h>
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;
}
结果
打印出两个子进程分别写入的结果

linux进程的管道通信的更多相关文章
- Linux进程间的通信
一.管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: A. 管道是半双工的,数据只能向一个方向流动: B. 需要双工通信时,需要建立起两个管道: C. 只能用于父子进程或者兄弟 ...
- PHP与Linux进程间的通信
进程间通信预计是公司考察应届毕业生的必考点(嵌入式行业).当然非常多公司考的是算法. 不查阅资料,我脑子里能想到的 [1] 管道, (有名.无名) [2] 父子进程 [3] System V (消息队 ...
- linux进程的软中断通信
linux进程的软中断通信 要求 实现软中断通信的程序 使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上发出的中断信号(即按delete键),当父进程接收到这两个 ...
- Linux下进程间管道通信小作业
在进行这次作业之前,我们先来看看什么是管道吧! 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间, ...
- Linux IPC之管道通信
2017-04-07 管道通信在linux中使用较为频繁的进程通信机制.基于unix一切皆文件的传统,管道也是一种文件.所以可以使用一般的VFS接口对管道进行读写操作,如read.write.具体管道 ...
- linux进程、管道和重定向
1.shell先后使用fork和exec系统调用来执行一个外部命令. 2.在linux系统中,有三个文件会被内核自动打开,分别是stdin.stdout.stderr. 3.进程的属性相关命令: 查看 ...
- linux进程间的通信之 共享内存
一.共享内存介绍 共享内存是三个IPC(Inter-Process Communication)机制中的一个. 它允许两个不相关的进程访问同一个逻辑内存. 共享内存是在两个正在进行的进程之间传递数据的 ...
- WCF实现进程间管道通信Demo
一.代码结构: 二.数据实体类: using System; using System.Collections.Generic; using System.Linq; using System.Run ...
- linux 管道通信
下面举linux下有名管道通信的代码. ----------------------------------------- fifo_read.c =========== #include<er ...
随机推荐
- react 学习文章
生命周期 学习笔记 一些坑 项目完成后总结 理解Immutable 是否要同构如何同构 react组件最佳实践 redux集合所有的state props来源, 页面所有状态 数据的唯一来源 reac ...
- 你必须知道的495个C语言问题,学习体会二
这是本主题的第二篇文章,主要就结构体,枚举.联合体做一些解释 1.结构体 现代C语言编程 结构化的基石,diy时代的最好代言人,是面向对象编程中类的老祖宗. 我们很容易定义一个结构体,比如学生: st ...
- InpOut32 CSharpExample.cs hacking
/************************************************************************************ * InpOut32 CSh ...
- bzoj 4555 求和
求 $\sum\limits_{i=0}^n\sum\limits_{j=0}^n Stirling2(i,j) \times 2^j \times j!$ $n \leq 100000$ sol: ...
- 什么是 DDoS 攻击?
欢迎访问网易云社区,了解更多网易技术产品运营经验. 全称Distributed Denial of Service,中文意思为“分布式拒绝服务”,就是利用大量合法的分布式服务器对目标发送请求,从而导致 ...
- C#编程的几个建议
1.属性(properties) 抽象属性可以放在接口的定义里.如: public interface INameValuePair<T> { string Nam ...
- HTTP 和 SOAP
http:是一个客户端和服务器端请求和应答的标准(TCP).http协议其目的是为了提供一种发布和接收htttp页面的方法 一http协议的客户端与服务器的交互:由HTTP客户端发起一个请求,建立一个 ...
- SQL Server: Top 10 Secrets of a SQL Server Expert
转载自:http://technet.microsoft.com/en-us/magazine/gg299551.aspx Many companies have downsized their IT ...
- django的多对一,一对一,多对多关系
from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) a ...
- Python学习系列(五)(文件操作及其字典)
Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件 在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出 ...