进程间通信之管道

pipe函数

管道是一种最基本的进程间通信机制。
首先来说一下它的缺点:
        1、半双工。所谓半双工就是同一时刻只能有一方的数据流通过。
        2、只能在具有公共祖先的进程间使用。
尽管有以上两种局限性,但管道仍是最常用的IPC形式。

调用pipe创建管道之后接着调用fork函数,创建的半双工管道如下:

调用fork之后怎样操作取决于我们想要的数据流方向。对应父进程到子进程的管道,父进程关闭管道的读端fd[0],子进程关闭管道的写端fd[1]。管道数据流方向如下:

代码实例如下:

/******************************************************************************
            版权所有 (C), 2018-2019, xxx Co.xxx, Ltd.
 ******************************************************************************
    文 件 名 : main.c
    版 本 号 : V1.0
    作    者 : lijd
    生成日期 : 2019年1月18日
    功能描述 : pipe简单实例
    修改历史 :
******************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

#define MAXLINE  1024

int main(int argc,char *argv[])
{
    int n;
    int fd[2];
    pid_t pid;
    char line[MAXLINE];
	
    if(pipe(fd) < 0)
    {
        printf("pipe error!\n");
        return -1;
    }
	
    pid = fork()

    if(pid < 0)
    {
        printf("fork error!\n");
        return -1;
    }
    else if(pid > 0)		//父进程
    {
        close(fd[1]);
        n = read(fd[0], line, MAXLINE);
        write(1, line, n);
    }
    else
    {
        close(fd[0]);
        char w_test[] = "this is lijd test!\n";
        write(fd[1], w_test, sizeof(w_test));
    }
	
    return 0;
}

popen函数

管道的一个常见用途是执行 shell 命令并读取其输出或向其发送一些输入。popen()和pclose()函数简化了这个任务。

popen()函数创建了一个管道,然后创建了一个子进程来执行shell,而shell又创建了一个子进程来执行command字符串。

type参数是一个字符串,它确定调用进程是从管道中读取数据(type是r)还是将数据写入到管道中(type是w)。type的取值确定了所执行的命令的标准输出是连接到管道的写入端还是将其标准输入连接到管道的读取端。

实例代码如下:

/************************************************
作   者  : lijd
生成日期 : 2020年01月08日
功能描述 : popen()函数实现类似shell管道功能 
************************************************/
 
#include <stdlib.h>
#include <stdio.h>
 
#define BUF_SIZE 4096 
 
void popen_read(char *buf, char *cmd)
{
    FILE *p_file = NULL;
    p_file = popen(cmd, "r");
    if (p_file == NULL) {
        exit (-1);
    }
	
    fread(buf, 1, BUF_SIZE, p_file);
	
    pclose(p_file);
}
 
void popen_write(char *buf, char *cmd)
{
    FILE *p_file = NULL;
    p_file = popen(cmd, "w");
    if (p_file == NULL) {
        exit (-1);
    }
    fwrite(buf, 1, BUF_SIZE, p_file);
	
    pclose(p_file);
}
 
int main(int argc, char *argv[])
{
    char buf[BUF_SIZE] = {0};
	
    if(argc != 3)
    {
        printf("argc error! please cheak!\n");
        exit(1);
    }
	
    popen_read(buf, argv[1]);
    popen_write(buf, argv[2]);
	
    return 0;
}

执行结果如下:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值