Linux编程 — IPC之管道
#include <unistd.h> int pipe(int filedes[2]); // 成功返回0,出错返回-1
#include <stdio.h> #include <unistd.h> #define MAXLINE 1024 int main(void) { int n; int fd[2]; pid_t pid; char buf[MAXLINE]; if (pipe(fd) < 0) return -1; if ((pid = fork()) < 0) return -1; else if (pid > 0) { // 父进程 printf("parent ID = %d\n", getpid()); close(fd[0]); write(fd[1], "Hello world\n", 12); } else { // 子进程 printf("child ID = %d\n", getpid()); close(fd[1]); n = read(fd[0], buf, MAXLINE); write(STDOUT_FILENO, buf, n); } return 0; }
#include <stdio.h> FILE *popen(const char *cmdstring, const char *type); // 成功返回文件指针,出错返回NULL int pclose(FILE *fp); // 获得cmdstring的终止状态,出错返回-1
- "r"表示文件指针连接到cmdstring的标准输出,父进程读cmdstring的数据。
- "w"表示文件指针连接到cmdstring的标准输入,父进程向cmdstring写数据。
- popen返回的文件指针同样不对应标准输入和标准输出,这可以通过fileno函数把文件指针转换成文件描述符进行查看。
- 函数pclose不仅关闭标准I/O流,还要获得子进程终止状态。如果不使用这个函数,当父进程还在运行而子进程运行完毕后会产生僵死进程,等下会通过实验来说明。
#include <stdio.h> #include <unistd.h> #include <string.h> #define MAXLINE 1024 int main(void) { char buf[MAXLINE]; FILE *fpin; int n; if ((fpin = popen("date", "r")) == NULL) // 启动data命令 return -1; fgets(buf, MAXLINE, fpin); // 获得data命令的输出 write(STDOUT_FILENO, buf, strlen(buf)); // 将数据打印到终端 pclose(fpin); return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。