繁体   English   中英

从execlp()获得回报

[英]Getting return from execlp()

我有一个程序,希望对子进程中文件的第一列进行排序,然后将输出返回给父进程。 如何从execlp检索响应并进行打印? 这是我到目前为止的内容:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

#define WRITE 1
#define READ 0

int main(int argc, char **argv)
{
    int i, k;
    int p1[2], p2[2];

    int p1[2], p2[2];
    pid_t childID;

    if (pipe(p1) < 0 || pipe(p2) < 0) {
        perror("pipe");
        exit(0);
    }

    childID = fork();

    if (childID < 0) {      
        perror("fork");
        exit(0);
    }
    else if (childID == 0){                                 
        close(p1[WRITE]);
        close(p2[READ]);

        dup2(p1[READ], STDIN_FILENO);
        close(p1[READ]);
        dup2(p2[WRITE], STDOUT_FILENO);
        close(p2[WRITE]);

        execlp("sort", "-k1", "-n", "temp.txt", (char *)NULL);
        perror("exec");
        exit(0);
    }
    else {                                                  
        //parent process
        //Not sure how to get response from exec


    }
}

调用execlp() ,当前进程的内存映像将调用的progame 替换 ,因此您无法通过返回值获得所需的内容。 您可以做的是让子进程将其结果写到某个位置,例如临时文件或管道,然后父进程从该位置读取结果。

正确设置在父进程和子进程之间进行通信的管道后,您可以在其stdout中写入子进程的结果,并从其stdin的父进程中读取结果。

像这样:

else if (childID == 0){                                 
    close(p1[READ]);

    dup2(p1[WRITE], STDOUT_FILENO);
    close(p1[WRITE]);

    execlp("sort", "-k1", "-n", "temp.txt", (char *)NULL);
    perror("exec");
    exit(0);
}
else {                                                  
    close(p1[WRITE]);

    dup2(p1[READ], STDIN_FILENO);
    close(p1[READ]);

    while (scanf("%ms ", &l) != EOF) {
        printf("%s\n", l);
        free(l);
    }
}

这是完整的代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

#define WRITE 1
#define READ 0

int main(int argc, char **argv)
{
    int p1[2];
    char *l;

    pid_t childID;

    if (pipe(p1) < 0) {
        perror("pipe");
        exit(0);
    }

    childID = fork();

    if (childID < 0) {      
        perror("fork");
        exit(0);
    }
    else if (childID == 0){                                 
        close(p1[READ]);

        dup2(p1[WRITE], STDOUT_FILENO);
        close(p1[WRITE]);

        execlp("sort", "-k1", "-n", "temp.txt", (char *)NULL);
        perror("exec");
        exit(0);
    }
    else {                                                  
        close(p1[WRITE]);

        dup2(p1[READ], STDIN_FILENO);
        close(p1[READ]);

        while (scanf("%ms ", &l) != EOF) {
            printf("%s\n", l);
            free(l);
        }
    }

    return 0;
}

并测试文件temp.txt

$ cat temp.txt
a
e
b
d
f
c

测试结果:

$ ./a.out 
a
b
c
d
e
f

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM