进程间通信之套接字 & 管道 & FIFO

本文详细介绍了Linux系统中进程间通信的三种方式:管道(包括匿名管道和命名管道FIFO)、popen和pclose函数。管道是半双工的通信机制,适用于父子进程或兄弟进程间通信。命名管道克服了匿名管道的限制,允许无亲缘关系的进程通信。popen和pclose函数通过shell启动子进程,提供了一种简单的进程间通信方式。此外,文章还提供了各种通信方式的使用示例和优缺点分析。
摘要由CSDN通过智能技术生成

摘自:https://blog.csdn.net/daaikuaichuan/article/details/82827994

一、管道(pipe)

1、管道的定义和特点

管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称为半双工管道。管道的这一特点决定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一,具有以下特点:

数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道);如果要进行双工通信,需要建 立两个管道;
管道只能用于父子进程或者兄弟进程间通信。,也就是说管道只能用于具有亲缘关系的进程间通信。

2、管道的命令

command1 | command2 | command3

操作符是:”|”,它只能处理经由前面一个指令传出的正确输出信息,对错误信息信息没有直接处理能力。然后,传递给下一个命令,作为标准的输入。
  举个例子,在shell中输入命令:ls -l | grep string,我们知道ls命令(其实也是一个进程)会把当前目录中的文件都列出来,但是它不会直接输出,而是把本来要输出到屏幕上的数据通过管道输出到grep这个进程中,作为grep这个进程的输入,然后这个进程对输入的信息进行筛选,把存在string的信息的字符串(以行为单位)打印在屏幕上。

3、管道的使用

#include <unistd.h>  
int pipe(int filedes[2]);   //成功返回0,失败返回-1

pipe函数用来创建一个管道,fd是传出参数,用于保存返回的两个文件描述符,该文件描述符用于标识管道的两端,fd[0]只能由于读,fd[1]只能用于写。所以管道只能保证单向的数据通信。
  一般管道的使用方式都是:父进程创建一个管道,然后fork产生一个子进程,由于子进程拥有父进程的副本,所以父子进程可以通过管道进程通信。这种使用方式如下图所示:

对于从父进程到子进程的管道,父进程关闭读端(fd[0]),子进程关闭写端(fd[1]);对于从子进程到父进程的管道,子进程关闭读端(fd[0]),父进程关闭写端(fd[1])。

当管道的一端被关闭后,会出现下面的几种情况:

  1. 当读一个写端被关闭的管道时,在所有数据都被读取后,read返回0,表示文件结束;如果写端没有被关闭,但是没有数据,则读端读完数据后阻塞;

  2. 当写一个读端被关闭的管道时,则产生信号SIGPIPE,write返回-1,errno设置为EPIPE;如果读端没有被关闭,写端写满数据后,则写端阻塞。

4、管道的demo

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>

int main()
{
   
    int fd[2]; // 定义文件描述符
    pid_t pid;
    char str[1024] = "hello\n";
    char buf[1024];
    if (pipe(fd) < 0) // 创建管道,成功返回0,失败返回-1
    {
   
        perror("pipe");
        exit(1);
    }
    pid = fork(); // 创建一个子进程
    // 功能:父写子读
    if (pid > 0) // 父进程
    {
   
        close
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值