• dushu.tw 读书网、小说免费阅读网站

Linux进程间通信之管道简述

这篇文章我们将介绍Linux间进程通间信中的有名管道与无名管道。

一.无名管道

无名管道是一种特殊类型的文件,在内核中对应的资源即一段特殊内存空间,这段空间全由操作系统管理和维护。可以使用read/write函数进行读写操作,但不能使用lseek函数来修改当前的读写位置,因为管道需要满足FIFO的原则

读写无名管道:

读写管道使用的系统调用就是read和write,两者都默认以阻塞方式读写管道,如果要修改这两个函数的行为,可以使用fcntl函数实现。

读写特点:

Linux进程间通信之管道简述
Linux进程间通信之管道简述
Linux进程间通信之管道简述
Linux进程间通信之管道简述
Linux进程间通信之管道简述

利用无名管道实现子进程发送数据,父进程接收数据

#include <stdio.h>  #include <unistd.h>  #include <string.h>    int main()  {      int filedes[2];      char buf[10] = {0};        pipe(filedes);        printf("Please input your string: n");        if(fork() == 0)      {          close(filedes[0]);            while(1){              fgets(buf, 10, stdin);              int ret = write(filedes[1], buf, strlen(buf));              if(ret < 0)                  break;          }      }      else      {          close(filedes[1]);            while(1){              int ret = read(filedes[0], buf, sizeof(buf));              if(ret < 0)                  break;              printf("The msg that you input is : %sn", buf);              printf("Please input your string: n");              memset(buf, 0, sizeof(buf));          }      }        return 0;  }
二.有名管道

有名管道FIFO依赖于文件系统是一个存在的特殊文件,因此,FIFO可以在同主机任意进程间实现通信。

有名管道虽然和普通文件一样具有磁盘存放路径、文件权限和其他属性;但是,它和普通文件又有区别,有名管道并没有在磁盘中存放真正的信息,它存储的通信信息在内存中,两个进程结束后自动丢失,拥有的一个磁盘路径仅仅是一个接口,其目的是使用进程间信息的编程更简单统一。通信的两个进程结束后,它的文件路径本身仍然存在,这是和无名管道不一样的地方

读写有名管道:
通过write和read来操作有名管道前,需要调用open()函数打开该文件,另外,操作有名管道的阻塞位置为open位置而不是无名管道的读写位置。

读写特点:

Linux进程间通信之管道简述

单进程读写有名管道:

#include <stdio.h>  #include <unistd.h>  #include <sys/types.h>  #include <sys/stat.h>  #include <fcntl.h>    #define FIFO_MODE 00600  #define FD_FLAG O_RDWR    int main(int argc, char** argv)  {      char buf[] = "Lance#";      char RecvBuf[20] = {0};        unlink(argv[1]);        mkfifo(argv[1], FIFO_MODE);        int fd = open(argv[1], FD_FLAG);        write(fd, buf, sizeof(buf));        read(fd, RecvBuf, sizeof(buf));        puts(RecvBuf);        return 0;  }  

执行结果:

Linux进程间通信之管道简述

管道基本特点总结:

Linux进程间通信之管道简述

本文永久更新链接地址:http://www.linuxidc.com/Linux/2018-02/150774.htm

Linux进程间通信之管道简述


举个栗子 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Linux进程间通信之管道简述
喜欢 (0)
关于作者:
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到