gpt4 book ai didi

C - exec 不输出到管道

转载 作者:太空狗 更新时间:2023-10-29 16:12:17 30 4
gpt4 key购买 nike

我正在制作一个最终能够(理论上)为传递给它的任何 shell 命令工作的程序。我的问题是运行的 exec 不会将其输出放入管道,而是在运行时似乎初始调用进入了管道?我尝试先刷新标准输出,但它不起作用。感谢您的帮助!

int main(int argc, char *argv[]) {

int i=0, pid;
int dataPipe[2];
pipe(dataPipe);

char *newArgs[5] = {"/bin/sh", "-c", "ls", "-a", NULL};

if ((pid = fork()) < 0) {

printf("Error: could not fork!");
exit(2);
}

else if (pid == 0) {

close(dataPipe[0]);
fflush(stdout);

dup2(dataPipe[1], 1);
close(dataPipe[1]);

if (execvp(newArgs[0], newArgs) < 0) {

printf("Command Failed to exucute!");
exit(3);
}
}

else {

char buf[BUFFER];
close(dataPipe[1]);

wait(0);
printf("Command exexuted correctly!\n");

while(read(dataPipe[0], buf, BUFFER) != 0) {
printf("Here is the command's output:\n%s\n", buf);
}

exit(0);
}

return 0;
}

这是输出:

$ ./doit ls -a                                       
Command exexuted correctly!
Here is the command's output:
d
@
Here is the command's output:
o
@
Here is the command's output:
i
@
Here is the command's output:
t
@
Here is the command's output:
@
Here is the command's output:
d
@
Here is the command's output:
o
@
Here is the command's output:
i
@
Here is the command's output:
t
@
Here is the command's output:
.
@
Here is the command's output:
c
@
Here is the command's output:


@

最佳答案

您的一切都正确。只需对代码进行几处更改即可使一切正常运行。

更改行:

    while(read(dataPipe[0], buf, BUFFER) != 0) {
printf("Here is the command's output:\n%s\n", buf);
}

    printf("Here is the command's output:\n");
while( (count = read(dataPipe[0], buf, BUFFER)) != 0) {
fwrite(buf, count, 1, stdout);
}

第一个变化,移动 "Here is the command's output:\n" 的打印应该是显而易见的。您不希望每次成功读取某些数据时都打印该行。

第二个变化有点微妙。

行:

printf("%s\n", buf);

与行完全不同:

fwrite(buf, count, 1, stdout);

printf 方法有几个问题:

  1. printf 调用中,您在每次成功完成 read 时在输出中引入换行符,这在派生进程的输出中是没有的.

  2. printf 命令只有在 buf 是一个以 null 结尾的字符串时才有效。 read 不会创建以 null 结尾的字符串。使用 read,您将获得一组原始字符。通过在预期以 null 结尾的字符串的位置使用 buf,您将调用未定义的行为。

使用 fwrite 而不是 printf 可以解决这两个问题。它不打印任何额外的换行符。它只打印从管道读取的确切字节数。

关于C - exec 不输出到管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25736898/

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