linux进程通信的方式(1)

来源:互联网 发布:切尔诺贝利核事故 知乎 编辑:程序博客网 时间:2024/06/05 00:29

Linux进程间通信方式

一,  无名管道

1,      无名管道(pipe)

特点:单向的,先进先出,

      只用于父子进程间的同信

      管道尾部写入数据,管道头部独处数据

      被读取的数据,将不存在管道中,其他的进程也读不到。

      管道对于进程两端而言,也是文件操作,所以,可以用不带缓冲的文件操作函数进行相应的读取。

2,      管道操作

创建:pipe()

读取:read();

写入:write();

关闭:close()

 

3,      pipe函数

函数作用:创建无名管道

函数原型:int pipe(int filedes[2])

函数参数:数组filedes保存文件描述符,分别是filedes[1]:管道的写入端

         filedes[0]:管道的读取端

返回值:成功返回0,失败返回1.

案例:如何创建无名管道。

案例:如何通过管道进行父子进程之间的通信

 


步骤1,先创建一个管道

步骤2,通过fork()函数创建一个子进程,该子进程会继承父进程所创建的管道,即就是在创建线程前的所有代码,子进程都会拷贝,其中就包括管道。

注意点:系统调用fork()函数肯定在调用pipe()函数之后,否则子进程就不继承文件描述符。



4,      读写无名管道

关注点:管道是空的,读不出数据,需要等待

        管道是满的,写不进去数据,需要等待

案例:管道读写。





附加结论:如果管道写入端关闭后,写入的数据将一直存在,直到读出为止。

      在创建子进程和父进程之前,都要关闭

相应的写入端和读取端。这样一个线程被阻塞,另一个线程才能运行,因为系统最多只允许一个线程存在。    

二,  有名管道(FIFO)

1,      有名管道

特点:运行于同一个系统中的任意两个进程间的通信

       遵循先进先出,读写注意同无名管道。

       以FIFO的文件形式存在于系统中,

2,      管道操作

创建管道mkfifo

打开管道open

读管道read

写管道write

关闭管道close

删除管道unlink

  3,mkfifo函数

   函数作用:创建有名管道

   函数原型:intmkfifo(const char * pathname, mode_t mode)

   函数参数:

 

  函数返回值:成功返回0;

               成功返回-1

4,FIFO与文件的区别 

FIFO文件在使用上和普通文件有相似之处,但是也有不同之处:

1. 读取fifo文件的进程只能以”RDONLY”方式打开fifo文件。

2. 写fifo文件的进程只能以”WRONLY”方式打开fifo

3.  fifo文件里面的内容被读取后,就消失了。但是普通文件里面的内容读取后还存在。

 

 

1 0
原创粉丝点击