Caso de comunicação de pipe anônimo

Implementar ps aux | grep xxx comunicação entre processos pai-filho

    Processo filho: ps aux, após o término do processo filho, envie os dados para o processo pai

    Processo pai: obter dados, filtrar

    cano()

    execlp()

    Redirecione a saída padrão stdout_fileno para a extremidade de gravação do pipe, dup2()

#include <unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<wait.h>
int main() {
    int fd[2];
    int ret = pipe(fd);
    if(ret == -1) {
        perror("pipe");
        exit(0);
    }
    pid_t pid = fork();
    if(pid > 0) {
        //父进程
        //关闭写端
        close(fd[1]);
        //从管道中读取
        char buf[1024] = {0};
        int len = -1;
        while((len = read(fd[0], buf, sizeof(buf) - 1)) > 0) {
            //过滤数据输出
            printf("%s", buf);
            memset(buf, 0, 1024);
        }
        wait(NULL);
    } else if(pid == 0) {
        //子进程,写管道
        //关闭读端
        close(fd[0]);
        //文件描述符的重定向 stdout_fileno -> fd[1]
        dup2(fd[1], STDOUT_FILENO);
        //执行ps aux
        execlp("ps", "ps", "aux", NULL);
        perror("execlp");
        exit(0);
    } else {
        perror("fork");
        exit(0);
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/ME_Liao_2022/article/details/133176269