我试图弄清楚为什么我的功能不起作用。 我在c中编写了一个递归函数,它执行在字符串数组中提供的管道命令。但由于某种原因,命令不会执行。
int run_piped_recursive(int index, char** arglist, int writefd){
printf("entered recursive piping %d\n", index);
while(index != 0){
if(strcmp(arglist[index],"|") == 0){
arglist[index] = NULL;
int pipesfd[2];
if(-1 == pipe(pipesfd)){
printf("Error creating pipe when trying to run %s piped.\nerrno:%d\nError:%s\n", arglist[index +1], errno, strerror(errno));
return -1;
}
int child_pid = fork();
if(child_pid < 0){
printf("Error executing fork when trying to run %s piped.\nerrno:%d\nError:%s\n", arglist[index +1], errno, strerror(errno));
return -1;
}
if(child_pid == 0){
close(pipesfd[0]);
run_piped_recursive(--index, arglist, pipesfd[1]);
exit(0);
}
else{
if(writefd != 1) {
if (-1 == dup2(writefd, STDOUT_FILENO)) {
fprintf(stdout, "Error while trying to duplicate fd when running %s piped.\nerrno:%d\nError:%s\n", arglist[index + 1], errno, strerror(errno));
return -1;
}
close(writefd);
}
close(pipesfd[1]);
if(-1 == dup2(pipesfd[0], STDIN_FILENO)){
fprintf(stderr, "Error while trying to duplicate fd when running %s piped.\nerrno:%d\nError:%s\n", arglist[index +1], errno, strerror(errno));
return -1;
}
close(pipesfd[0]);
pthread_t wait_child_thread;
if (-1 == pthread_create(&wait_child_thread, NULL, wait_pid_func, &child_pid)) {
fprintf(stderr,"Error waiting for process with pid %d, running %s.\nerrno:%d\nError:%s\n", child_pid, arglist[0], errno, strerror(errno));
}
if(-1 == execvp(arglist[index + 1], (arglist + index + 1) )){
fprintf(stderr, "Error running the command %s.\nerrno:%d\nError:%s\n", arglist[0], errno, strerror(errno));
return -1;
}
}
}
index--;
}
if(1 != writefd) {
printf("in if %d\n", writefd);
if (-1 == dup2(writefd, STDOUT_FILENO)) {
fprintf(stderr,"Error while trying to duplicate fd when running %s piped.\nerrno:%d\nError:%s\n", arglist[index +1], errno,
strerror(errno));
return -1;
}
close(writefd);
}
if(-1 == execvp(arglist[index], arglist )){
fprintf(stderr,"Error running the command %s.\nerrno:%d\nError:%s\n", arglist[0], errno, strerror(errno));
return -1;
}
}
我已经向函数传递了以下参数:arglist的大小减去1(最后一个字符串的索引),arglist,STDOUT_FILENO。
当arglist是{&#34; ls&#34; &#34; |&#34; &#34; grep的&#34; &#34;&#34; }。该函数似乎运行但没有任何东西被打印到stdout我也试过而不是创建一个线程来等待孩子完成我现在正在使用waitpid。似乎这个过程正在运行&#34; ls&#34;以及运行&#34; grep&#34;完成(程序在调试后继续运行)但没有任何内容正在打印到stdout。