我正在尝试执行一个外部程序(echo
仅用于测试,但是仍然可以工作)。该程序接受第一个参数,然后将其提交给第二个参数,这需要通过STDIN进行。
如果您打印出管道内容而不是使用exec
,则重定向到管道并因此重定向到STDIN的工作是完美的。
但是程序(echo
)未返回任何内容,其行为保持不变。因此,STDIN不会被重定向,但是我不明白为什么。我缺少的exec
系列中是否缺少参数?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("parameters do not match");
exit(1);
}
// create two pipes
int downstream[2];
int upstream[2];
pipe(downstream);
pipe(upstream);
// create child
if (fork() == 0)
{
// close not required descriptors
close(upstream[0]);
close(downstream[1]);
// close and duplicate stdin/stdout from pipe
dup2(downstream[0], STDIN_FILENO);
dup2(upstream[1], STDOUT_FILENO);
// exec
// What to do here?
char *args[] = {"echo", NULL};
execvp(args[0], args);
exit(0);
}
// close not required
close(upstream[1]);
close(downstream[0]);
// send second argument to pipe
write(downstream[1], argv[1], strlen(argv[1]));
// read result from pipe
char buffer[100];
read(upstream[0], buffer, 100);
printf("OUTPUT: %s", buffer);
exit(0);
}
答案 0 :(得分:1)
您可能希望修改数据的传递方式,以使其适用于以块为单位运行的程序,并期待EOF指示器。
一旦传送数据,主电源应关闭下游。这将允许许多在缓冲模式下工作的程序处理输入,即使输入未完成也是如此。还应该检查来自子级数据的错误/ EOF,并处理大块的输出。
建议的main
...
close(upstream[1]);
close(downstream[0]);
// send second argument to pipe
write(downstream[1], argv[1], strlen(argv[1]));
close(downstream[1]) ;
// read result from pipe
char buffer[100];
int nread ;
// Lop until EOF or error.
while ( (nread=read(upstream[0], buffer, sizeof(buffer)-1) > 0 ) {
buffer[nread] = 0 ; // NUL terminator.
printf("OUTPUT: %s", buffer);
} ;
exit(0);