我正在为c开发一个shell程序,并试图弄清楚为什么提示用户作出响应后它为什么会不断跳出循环。它可以正确运行命令,但是由于某些原因会中断。我不知道为什么,我认为它必须与做管道的方式有关。
这就是我的示例,应该运行管道命令,并要求用户继续一次又一次地运行命令,直到用户输入“是”以外的内容。可能是execvp导致中断吗?我怎么能拥有它,使它继续循环?使用分叉更新进行编辑。
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
int main()
{
char str[3];
do{
char* leftSide[] = {"ls", NULL};
char* rightSide[] = {"wc", NULL};
pid_t id, id2;
int pipe_fd[2];
pipe(pipe_fd);
id = fork();
if(id == 0){
dup2(pipe_fd[0],0);
close(pipe_fd[1]);
close(pipe_fd[0]);
if(execvp(rightSide[0], rightSide) == -1){
perror("error running pipe right command");
}
}
else{
id2 = fork();
if(id2 == 0){
dup2(pipe_fd[1],1);
close(pipe_fd[1]);
close(pipe_fd[0]);
if(execvp(leftSide[0],leftSide) == -1){
perror("error running pipe left command");
}
}
else{
wait(NULL);
wait(NULL);
}
}
printf("Continue?");
fgets(str, 3, stdin);
str[3] = '\0';
}while(strcmp(str, "yes") == 0);
return 0;
}
答案 0 :(得分:2)
您要终止程序
if(execvp(leftSide[0],leftSide) == -1){
您必须两次fork()
;一次用于rightSide
,一次用于leftSide
。
答案 1 :(得分:1)
这里有两个问题:
正如@ensc指出的那样,在他的回答中,您的程序在调用execvp
时终止。您将不得不生两个孩子,父母将保留您的程序,要求用户提供更多输入,而孩子将执行leftside
和rightside
。
第二个问题是fgets
根据手册页:
fgets()从流中读取最多小于大小的字符,并将其存储到s指向的缓冲区中。在EOF或换行符之后停止读取。如果读取了换行符,则它将存储在缓冲区中。
因此,从用户输入的字符串将是"yes\n"
而不是"yes"
,并且strcmp
总是失败。