一起talk C栗子吧(第九十回:C语言实例--使用管道进行进程间通信三)
各位看官们,大家好,上一回中咱们说的是使用管道进行进程间通信的样例。这一回咱们说的样例是:使用管道进行进程间通信。只是使用管道的方式不同样。闲话休提,言归正转。让我们一起talk C栗子吧!
我们在前面章回中介绍了三种管道。这一回我们介绍第三种管道及其使用方法。
最主要还是让大家明确怎样使用管道进行进程间的通信。
第三种管道我称之为真正意义上的管道。该管道还有另外一个名字:命名管道(FIFO)。在介绍它之前。我们先介绍一个函数:mkfifo.
mkfifo函数的原型
int mkfifo(const char *filename, mode_t mode)
- 该函数用来创建一个管道文件;
- 该函数的第一个參数是字符串,用来表示管道文件的名字;
- 该函数的第二个參数是文件訪问权限,用来表示管道文件的权限,比如:0764;
- 该函数会返回一个文件描写叙述符,能够通过该文件描写叙述符来操作管道;
- 该函数执行成功时返回0,否则返回-1。
明确这个函数的使用方法后,我们接下来介绍命名管道的使用方法.
mkfifo函数的使用方法
- 1.使用mkfifo函数创建一个命名管道。
- 2.在进程A中使用open打开管道(打开方式为写),这时会得到一个fd;
- 3.使用write通过fd在管道中写入数据;
- 4.使用close关闭步骤2中得到的fd;
- 5.在进程B中使用open打开管道(打开方式为读),这时会得到一个fd;
- 6.使用read通过fd从管道中读取数据;
- 7.使用close关闭步骤5中得到的fd。
我们能够看到,进程A在mkfifo创建的管道中写入数据,进程B从该管道中读取数据。进程A和B通过该管道实现了进程之间的通信。通信的内容为数据。
我们接下来使用具体的样例进行说明,以下是具体的代码:
int main()
{
char input[] = "IPC by pipe";
char output[BUFSIZ+1];
char p_name[] = "/tmp/test_fifo";
int count = 0;
int fd;
int stat_value;
pid_t pid,pid_res;
memset(output,'\0',sizeof(output));
if(mkfifo(p_name,0777) == 0) // create pipe
{
pid = fork();
if(pid > 0)
{
printf("father running \n");
fd = open(p_name,O_RDONLY); //open by read mode
if(fd == -1)
{
printf("open pipe file failed \n");
return 1;
}
}
else if(pid == 0)
{
printf("son running \n");
fd = open(p_name,O_WRONLY); //open by write mode
if(fd == -1)
{
printf("open pipe file failed \n");
return 1;
}
count = write(fd,input,strlen(input)); // write the dato into pipe
printf("son process write %d characters,they are : %s \n",count,input);
close(fd);
}
else
{
printf("create process failed \n");
return 1;
}
}
else
{
printf("create fifo failed \n");
return 1;
}
pid_res = wait(&stat_value);
if(pid_res > 0)
{
count = read(fd,output,BUFSIZ); // read the data from pipe
printf("father process read %d characters,they are: %s \n",count,output);
close(fd);
}
return 0;
}
通过上面的代码。大家能够发现,我们首先创建了一个命名管道。然后用fork创建了子进程。而且在子进程中向管道中写入数据。接着在父进程中读取数据,只是父进程使用wait函数等待子进程写入数据后才去管道中读取数据。这便是进程之间相互排斥的应用。假设不这样做的话,父进程从管道中读取数据时,子进程还没有把数据写入管道。
看官们,正文中就不写代码了。具体的代码放到了我的资源中,大家能够点击这里下载使用。
以下是程序的执行结果,请大家參考:
./s //执行编译后的程序
father running //父进程在执行
son running //子进程在执行
son process write 11 characters,they are : IPC by pipe //子进程向管道中写入数据
father process read 11 characters,they are: IPC by pipe //父进程从管道中读取数据
我们通过上面的程序执行结果能够看到,子进程在管道中写入了数据“IPC by pipe”,父进程接着从管道中读取了该数据,进而实现的了父子进程之间的传输数据,也就是进程之间的通信。
各位看官,关于使用信号进行进程间通信的样例咱们就讲到这里。
欲知后面还有什么样例,且听下回分解 。
一起talk C栗子吧(第九十回:C语言实例--使用管道进行进程间通信三)的更多相关文章
- 一起talk C栗子吧(第八十七回:C语言实例--使用管道进行进程间通信概述)
各位看官们,大家好.上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信. 闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的的章回中介绍了使用管道进行进程 ...
- 一起talk C栗子吧(第八十五回:C语言实例--使用信号进行进程间通信二)
各位看官们,大家好,上一回中咱们说的是使用信号进行进程间通信的样例,这一回咱们接着上一回的内容,继续说该样例.闲话休提.言归正转. 让我们一起talk C栗子吧. 我们在上一回中举了使用信号进行进程间 ...
- 一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)
各位看官们,大家好.上一回中咱们说的是C程序内存布局的样例,这一回咱们继续说该样例.闲话休提,言归正转.让我们一起talk C栗子吧. 看官们,关于C程序内存布局的样例,我们在前面的两个章回都介绍过了 ...
- 一起talk C栗子吧(第八十四回:C语言实例--使用信号进行进程间通信一)
各位看官们,大家好,上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用信号进行进程间通信.闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在上一回中提到过进程之间通信须要解决的三 ...
- 一起talk C栗子吧(第十回:C语言实例--最小公倍数)
各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例. 闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们说的是最大公约数的样例,这一回咱们说的 ...
- 一起talk C栗子吧(第七回:C语言实例--进制转换)
各位看官们.大家好,从今天開始.我们讲大型章回体科技小说 :C栗子,也就是C语言实例. 闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们.上一回中咱们说的是生成随机数的样例.这一回咱们说的 ...
- 一起talk C栗子吧(第九十 三回:C语言实例--进程间通信之临界资源)
各位看官们.大家好,前面章回中咱们说的是使用信号和管道进行进程间通信的样例.这一回咱们说的样例是:进程间通信之临界资源.闲话休提,言归正转.让我们一起talk C栗子吧! 我们首先介绍一下,什么是临界 ...
- 一起talk C栗子吧(第九回:C语言实例--最大公约数)
各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们.上一回中咱们说的是素数的样例.这一回咱们说的样例是: ...
- 一起talk C栗子吧(第八回:C语言实例--素数)
各位看官们,大家好,从今天開始.我们讲大型章回体科技小说 :C栗子,也就是C语言实例. 闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们.上一回中咱们说的是进制转换的样例,这一回咱们说的 ...
随机推荐
- python beautifulsoup获取特定html源码
beautifulsoup 获取特定html源码(无需登录页面) import refrom bs4 import BeautifulSoupimport urllib2 url = 'http:// ...
- CSU 2018年12月月赛 G(2219): Coin
Description 有这样一个众所周知的问题: 你面前有7个硬币,其中有一个劣质的(它比正常的硬币轻一点点),你有一个天平,问需要你需要使用天平多少次能保证找到那个劣质的硬币. 众所周知的算法是: ...
- 零基础入门学习Python(22)--函数:递归是神马
知识点 递归是神马? 递归是属于算法的范畴. 递归就是函数调用自身的一种行为. >>> def g(): return g() >>> g() Traceback ...
- 简述HTTP报文请求方法和状态响应码
1. Method 请求方法,表明客户端希望服务器对资源执行的动作: 1.1 GET 向服务器请求资源. 1.2 HEAD 和GET方法的行为类似,但服务器在响应中只返回首部,不会返回实体的主体部分. ...
- HDU 4945 (dp+组合数学)
2048 Problem Description Teacher Mai is addicted to game 2048. But finally he finds it's too hard to ...
- 【BZOJ2527】Meteors(整体二分)
题意: Byteotian Interstellar Union有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会 ...
- 2015山东信息学夏令营 Day5T3 路径
问题描述: 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. 输入: 第一行包含一个正整数n,表示点数. 接下来 ...
- RelativeLayout属性大全
- B - Euler theorem 数学
直接打表找规律 HazelFan is given two positive integers a,ba,b, and he wants to calculate amodbamodb. But no ...
- 技术杂记之:在阿里云centos7上部署JDK MYSQL TOMCAT
今日小编闲来无事,乘着公司新项目即将上线之际,在阿里云上整了一台centos作为测试机.原本以为一个小时搞定,结果还是花了一点小小时间.不管怎么说,记录下来,给各位小白当成课后甜点吧. 价格 先上价格 ...