linux IPC的PIPE

一、PIPE(无名管道)

函数原型:

#include <unistd.h>

int pipe(int fd[2]);

通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道。

父进程和子进程之间也可用通过pipe通信。

例子,父进程到子进程hello world:

 1 #include "apue.h"
 2 
 3 int main(void)
 4 {
 5         int n;
 6         int fd[2];
 7         pid_t pid;
 8         char line[MAXLINE];
 9 
10         if(pipe(fd) < 0)
11                 err_sys("pipe error");
12         if((pid = fork()) < 0) {
13                 err_sys("fork error");
14         } else if (pid > 0) {
15                 close(fd[0]);
16                 write(fd[1], "hello world\n", 12);
17         } else {
18                close(fd[1]);
19               n = read(fd[0], line, MAXLINE);
20                write(STDOUT_FILENO, line, n);
21         }
22         exit(0);
23 }

 

二、函数popen和pclose

#include <stdio.h>

FILE *open(const char *cmdstring, const char *type);

int pclose(FILE *fp);

创建一个管道,fork一个子进程,关闭未使用的管道端,执行一个shell运行命令,然后等待命令终止。

#include "apue.h"
#include <stdio.h>

int main()
{
    FILE *fp;
    char ch, line[300];

    fp = popen("ls *.c", "r");
    if(fp != NULL)
    {
        while(fgets(line, 300, fp))
        {
            printf("line=%s\n", line);
        }
    }

    pclose(fp);

    return 0;
}

 

posted @ 2017-12-18 17:24  习惯就好233  阅读(225)  评论(0编辑  收藏  举报