Ari*_*tas 4 c linux shell exec dup2
我必须编写一个可以运行管道的shell.例如ls -l | wc -l".我已成功解析用户给出的命令,如下所示:
"ls"= firstcmd
"-l"= frsarg
"wc"= scmd
"-l"= secarg
现在我必须使用两个叉子,因为命令是两个和一个管道.我写的执行命令的代码块如下:
pid_t pid;
int fd[2];
pipe(fd);
pid = fork();
if(pid==0)
{
dup2(fd[WRITE_END], STDOUT_FILENO);
close(fd[READ_END]);
execlp(firstcmd, firstcmd, frsarg, (char*) NULL);
}
else
{
pid=fork();
if(pid==0)
{
dup2(fd[READ_END], STDIN_FILENO);
close(fd[WRITE_END]);
execlp(scmd, scmd, secarg, (char*) NULL);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我运行我的shell并输入命令时ls -l | wc -l(例如),execs的结果没有显示,但是shell保持正常运行.
奇怪的是,只有当我用"exit"或"^ C"终止我的shell时,命令的结果才会显示.
输出有什么问题?输入命令后为什么不显示?
use*_*104 13
您需要关闭父进程和子进程中的所有管道描述符(在子进程中重复之后).在您的代码中,主要问题是,wc进程不会退出,因为仍然存在编写器(因为父进程尚未关闭写结束).更改如下所示.我还在waitpid父进程中添加了等待wc进程.
pid_t pid;
int fd[2];
pipe(fd);
pid = fork();
if(pid==0)
{
dup2(fd[WRITE_END], STDOUT_FILENO);
close(fd[READ_END]);
close(fd[WRITE_END]);
execlp(firstcmd, firstcmd, frsarg, (char*) NULL);
fprintf(stderr, "Failed to execute '%s'\n", firstcmd);
exit(1);
}
else
{
pid=fork();
if(pid==0)
{
dup2(fd[READ_END], STDIN_FILENO);
close(fd[WRITE_END]);
close(fd[READ_END]);
execlp(scmd, scmd, secarg,(char*) NULL);
fprintf(stderr, "Failed to execute '%s'\n", scmd);
exit(1);
}
else
{
int status;
close(fd[READ_END]);
close(fd[WRITE_END]);
waitpid(pid, &status, 0);
}
}
Run Code Online (Sandbox Code Playgroud)