各位看官们,大家好,上一回中咱们说的是使用管道进行进程间通信的样例。这一回咱们说的样例是:使用管道进行进程间通信。只是使用管道的方式不同样。闲话休提,言归正转。让我们一起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语言实例--使用管道进行进程间通信三)的更多相关文章

  1. 一起talk C栗子吧(第八十七回:C语言实例--使用管道进行进程间通信概述)

    各位看官们,大家好.上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信. 闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的的章回中介绍了使用管道进行进程 ...

  2. 一起talk C栗子吧(第八十五回:C语言实例--使用信号进行进程间通信二)

    各位看官们,大家好,上一回中咱们说的是使用信号进行进程间通信的样例,这一回咱们接着上一回的内容,继续说该样例.闲话休提.言归正转. 让我们一起talk C栗子吧. 我们在上一回中举了使用信号进行进程间 ...

  3. 一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)

    各位看官们,大家好.上一回中咱们说的是C程序内存布局的样例,这一回咱们继续说该样例.闲话休提,言归正转.让我们一起talk C栗子吧. 看官们,关于C程序内存布局的样例,我们在前面的两个章回都介绍过了 ...

  4. 一起talk C栗子吧(第八十四回:C语言实例--使用信号进行进程间通信一)

    各位看官们,大家好,上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用信号进行进程间通信.闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在上一回中提到过进程之间通信须要解决的三 ...

  5. 一起talk C栗子吧(第十回:C语言实例--最小公倍数)

    各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例. 闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们说的是最大公约数的样例,这一回咱们说的 ...

  6. 一起talk C栗子吧(第七回:C语言实例--进制转换)

    各位看官们.大家好,从今天開始.我们讲大型章回体科技小说 :C栗子,也就是C语言实例. 闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们.上一回中咱们说的是生成随机数的样例.这一回咱们说的 ...

  7. 一起talk C栗子吧(第九十 三回:C语言实例--进程间通信之临界资源)

    各位看官们.大家好,前面章回中咱们说的是使用信号和管道进行进程间通信的样例.这一回咱们说的样例是:进程间通信之临界资源.闲话休提,言归正转.让我们一起talk C栗子吧! 我们首先介绍一下,什么是临界 ...

  8. 一起talk C栗子吧(第九回:C语言实例--最大公约数)

    各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们.上一回中咱们说的是素数的样例.这一回咱们说的样例是: ...

  9. 一起talk C栗子吧(第八回:C语言实例--素数)

    各位看官们,大家好,从今天開始.我们讲大型章回体科技小说 :C栗子,也就是C语言实例. 闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们.上一回中咱们说的是进制转换的样例,这一回咱们说的 ...

随机推荐

  1. 20181228 模拟赛 T3 字符串游戏 strGame 博弈论 字符串

    3  字符串游戏(strGame.c/cpp/pas) 3.1  题目描述 pure 和 dirty 决定玩 T 局游戏.对于每一局游戏,有n个字符串,并且每一局游戏由K轮组成.具体规则如下:在每一轮 ...

  2. jenkins构建项目记录1

    jenkins安装见上篇随笔 1.新建任务 2.构建一个自由风格的软件项目 3.源码管理设置 4.构建环境 5.构建 6.构建后操作

  3. ruby rspec安装

    在rubymine里新建Rails application

  4. Far Relative’s Problem (贪心 计算来的最多客人)

    Description Famil Door wants to celebrate his birthday with his friends from Far Far Away. He has n  ...

  5. 集训第四周(高效算法设计)I题 (贪心)

    Description Shaass has n books. He wants to make a bookshelf for all his books. He wants the bookshe ...

  6. 关于OPENSSL的EVP函数的使用

    4月份没什么做,就是做了OPENSSL的 加密和解密的应用,现在公开一下如何调用OPENSSL对字符串进行加密和解密,当中也学会了对加密数据进行BASE64编码,现在公开一下代码,在这感谢GITHUB ...

  7. HDU 4478 Where is King

    题目大意: 一个王可以向周围8个方格走,如果都不通留在原地,t秒后,他可能存在的位置数 这题数据量过大,我们需要通过奇偶性判断,如果t = 0可以到达,说明 t=2,4,6....都可以到达 所以我这 ...

  8. [TyvjP1050] 最长公共子序列(DP)

    传送门 f[i][j] 表示第 1 个串匹配到第 i 位,第 2 个串匹配到第 j 位的答案. f[i][j] = max(f[i - 1][j], f[i][j - 1])    (a[i] != ...

  9. android开发里跳过的坑——图片文件上传失败

    使用的apache的httpclient的jar包,做的http图片上传,上传时,服务器总返文件格式不对.后来发现,是由于在创建FileBody时,使用了默认的ContentType引起的.所以服务器 ...

  10. zoj2479 Cover the Rectangular Ground

    肯定是dfs搜一下的,但是呢存在一个很大的剪枝,也就是面积必定要是相等的,那么如何去操作呢,可以想到的是二进制枚举选取的方法,然后把方法中选取的矩形面积求和并判断一下即可,然后dfs搜索,要注意的是, ...