无法读取和打印管道内容(来自通过 execv 执行的子进程)
Can't read and print pipe content (from child executing through execv)
我编写了一个程序来读取 bash 文件并执行该文件中的命令。我让执行部分工作了,但我似乎无法将命令输出重定向到管道,然后从管道中读取并打印其内容。我已经阅读了有关该主题的一些主题,但解决方案似乎不起作用。这是代码,
int main(int argc, char * argv[]) {
int pipefd[2];
char buf[1024];
int bytes = 0;
for (int i = 1; i < argc; i++) { // reading file as argument one at a time
FILE * fp;
fp = fopen(argv[i], "r");
char * buffer = NULL;
size_t buf_size = 0;
char bufread[1024];
int bytes_read = 0;
while (getline( & buffer, &buf_size, fp) != EOF) {
pid_t pid;
pid = fork();
pipe(pipefd);
if (pid == 0) {
close(pipefd[0]);
dup2(pipefd[1], 1);
dup2(pipefd[1], 2);
close(pfd[1]);
int length = countWords(buffer);
char * init_argv[length + 2];
init_argv[0] = "sh";
init_argv[1] = "-c";
init_argv[2] = buffer;
init_argv[3] = NULL;
execv("/bin/bash", init_argv);
} else {
int status;
close(pfd[1]);
waitpid(pid, & status, 0);
while (read(pfd[0], bufread, sizeof(bufread)) != 0) {
fprintf(stdout, "%s\n", bufread);
}
}
}
}
}
return 0;
}
当此程序 运行 使用包含命令作为参数的有效文件时,为什么没有任何输出?我知道没有 dup2 和 close 指令,程序会执行命令,所以这不是问题。一旦我将 dup2 和关闭指令添加到程序中,我就无法再调试它(它在 execv 时崩溃)。
我不确定这是否是问题所在,但不应该在调用 fork
之前执行调用 pipe(pipefd);
吗?
就像现在一样,我认为 parent 和 child 各自创建了一个不同的管道,并且他们不能使用这些管道相互通信,如果那是你想要的做。
我编写了一个程序来读取 bash 文件并执行该文件中的命令。我让执行部分工作了,但我似乎无法将命令输出重定向到管道,然后从管道中读取并打印其内容。我已经阅读了有关该主题的一些主题,但解决方案似乎不起作用。这是代码,
int main(int argc, char * argv[]) {
int pipefd[2];
char buf[1024];
int bytes = 0;
for (int i = 1; i < argc; i++) { // reading file as argument one at a time
FILE * fp;
fp = fopen(argv[i], "r");
char * buffer = NULL;
size_t buf_size = 0;
char bufread[1024];
int bytes_read = 0;
while (getline( & buffer, &buf_size, fp) != EOF) {
pid_t pid;
pid = fork();
pipe(pipefd);
if (pid == 0) {
close(pipefd[0]);
dup2(pipefd[1], 1);
dup2(pipefd[1], 2);
close(pfd[1]);
int length = countWords(buffer);
char * init_argv[length + 2];
init_argv[0] = "sh";
init_argv[1] = "-c";
init_argv[2] = buffer;
init_argv[3] = NULL;
execv("/bin/bash", init_argv);
} else {
int status;
close(pfd[1]);
waitpid(pid, & status, 0);
while (read(pfd[0], bufread, sizeof(bufread)) != 0) {
fprintf(stdout, "%s\n", bufread);
}
}
}
}
}
return 0;
}
当此程序 运行 使用包含命令作为参数的有效文件时,为什么没有任何输出?我知道没有 dup2 和 close 指令,程序会执行命令,所以这不是问题。一旦我将 dup2 和关闭指令添加到程序中,我就无法再调试它(它在 execv 时崩溃)。
我不确定这是否是问题所在,但不应该在调用 fork
之前执行调用 pipe(pipefd);
吗?
就像现在一样,我认为 parent 和 child 各自创建了一个不同的管道,并且他们不能使用这些管道相互通信,如果那是你想要的做。