gpt4 book ai didi

c - 从 execlp() 获取返回

转载 作者:行者123 更新时间:2023-11-30 17:39:16 25 4
gpt4 key购买 nike

我有一个程序,我想从子进程对文件中的第一列进行排序,并将输出返回到父进程。如何检索 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

关于c - 从 execlp() 获取返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21845181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com