1 2 | FILE *popen(const char *command, const char *mode); int pclose(FILE *stream); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | int pipe_in[2], pipe_out[2]; pid_t pid; pipe(&pipe_in); // 创建父进程中用于读取数据的管道 pipe(&pipe_out); // 创建父进程中用于写入数据的管道 if ( (pid = fork()) == 0) { // 子进程 close(pipe_in[0]); // 关闭父进程的读管道的子进程读端 close(pipe_out[1]); // 关闭父进程的写管道的子进程写端 dup2(pipe_in[1], STDOUT_FILENO); // 复制父进程的读管道到子进程的标准输出 dup2(pipe_out[0], STDIN_FILENO); // 复制父进程的写管道到子进程的标准输入 close(pipe_in[1]); // 关闭已复制的读管道 close(pipe_out[0]); // 关闭已复制的写管道 /* 使用exec执行命令 */ } else { // 父进程 close(pipe_in[1]); // 关闭读管道的写端 close(pipe_out[0]); // 关闭写管道的读端 /* 现在可向pipe_out[1]中写数据,并从pipe_in[0]中读结果 */ close(pipe_out[1]); // 关闭写管道 /* 读取pipe_in[0]中的剩余数据 */ close(pipe_in[0]); // 关闭读管道 /* 使用wait系列函数等待子进程退出并取得退出代码 */ } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | int fd[2]; pid_t pid; socketpair(AF_UNIX, SOCKET_STREAM, 0, fd); // 创建管道 if ( (pid = fork()) == 0) { // 子进程 close(fd[0]); // 关闭管道的父进程端 dup2(fd[1], STDOUT_FILENO); // 复制管道的子进程端到标准输出 dup2(fd[1], STDIN_FILENO); // 复制管道的子进程端到标准输入 close(fd[1]); // 关闭已复制的读管道 /* 使用exec执行命令 */ } else { // 父进程 close(fd[1]); // 关闭管道的子进程端 /* 现在可在fd[0]中读写数据 */ shutdown(fd[0], SHUT_WR); // 通知对端数据发送完毕 /* 读取剩余数据 */ close(fd[0]); // 关闭管道 /* 使用wait系列函数等待子进程退出并取得退出代码 */ } |
1 2 3 | FILE *dpopen(const char *command); int dpclose(FILE *stream); int dphalfclose(FILE *stream); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <stdio.h> #include <stdlib.h> #include "dpopen.h" #define MAXLINE 80 int main() { char line[MAXLINE]; FILE *fp; fp = dpopen("sort"); if (fp == NULL) { perror("dpopen error"); exit(1); } fprintf(fp, "orange\n"); fprintf(fp, "apple\n"); fprintf(fp, "pear\n"); if (dphalfclose(fp) < 0) { perror("dphalfclose error"); exit(1); } for (;;) { if (fgets(line, MAXLINE, fp) == NULL) break; fputs(line, stdout); } dpclose(fp); return 0; } |
1 2 3 | apple orange pear |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |