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; }
执行结果如下: