linux c之用命名管道实现进程通信

2/22/2017来源:ASP.NET技巧人气:1423

1、命名管道相关信息介绍

不是很了解命名管道先看这个篇博客 http://blog.csdn.net/u011068702/article/details/55102379 linux c之命名管道简单使用

博客介绍了创建管道的方法,这里还需要介绍 open函数和调用阻塞

FIFO文件也可以使用open调用来打开,mkfifo函数只是创建一个FIFO文件,要使用命名管道还是将其打开。 但是有两点要注意,

1、就是程序不能以O_RDWR模式打开FIFO文件进行读写操作,因为如一个管道以读/写方式打开,进程就会读回自己的输出,同时我们通常使用FIFO只是为了单向  的数据传递,要注意是O_REWR,不是O_WRONLY 2、就是传递给open调用的是FIFO的路径名,而不是正常的文件。

open API

    open(const char *path, O_RDONLY);//1  
    open(const char *path, O_RDONLY | O_NONBLOCK);//2  
    open(const char *path, O_WRONLY);//3  
    open(const char *path, O_WRONLY | O_NONBLOCK);//4  

open调用的阻塞

open函数第二个参数中,选项O_NONBLOCK表示非阻塞,加上这个选项后,表示open调用是非阻塞的,如果没有这个选项,则表示open调用是阻塞的。 open调用的阻塞到底是什么意思?很简单,对于以只读方式(O_RDONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_RDONLY),除非有一个进程以写方式打开同一个FIFO,否则它不会返回;如果open调用是非阻塞的的(即第二个参数为O_RDONLY | O_NONBLOCK),则即使没有其他进程以写方式打开同一个FIFO文件,open调用将成功并立即返回。 对于以只写方式(O_WRONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_WRONLY),open调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止;如果open调用是非阻塞的(即第二个参数为O_WRONLY | O_NONBLOCK),open总会立即返回,但如果没有其他进程以只读方式打开同一个FIFO文件,open调用将返回-1,并且FIFO也不会被打开。

2、实现进程通信代码

  实现功能:我们这里有两个源文件,一个源文件pipe11.c负责从Data.txt里面读入数据,然后写入管道,然后pipe12.c源文件是从管道如入数据,然后把读到的数据写入write.txt里面去

在pipe11.c的源文件如下

记得加上头文件

#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdlib.h>
#include<limits.h>
#include<string.h>
#include<fcntl.h>

然后就是pipe12.c的代码如下

3、运行结果展示

没有运行之前看下  Data.txt内容为: this is first pipe, I am name is chenyu! 然后是没有创建write.txt文件的

然后我们运行pipe11.c文件效果如下

我么可以看到阻塞了

然后我们运行pipe12.c文件效果如下

然后再去看运行pipe11.c的控制台

我么可以看到没有阻塞了,希望可以更好理解阻塞

我们再去看write.txt文件