2
我正在实现的是(更简单)版本的bash。其中一个任务是接受命令:将分叉的进程输出重定向到父进程C
$ bg <command> <arguments>
这一操作将一个新的进程,然后使用<command>
和<arguments>
作为参数运行的新进程execvp()
。问题是,当我从子进程捕获输出时,我使用pipe()
,并且在从子进程获取输出并在需要时输出它之后,我似乎无法切换回STDIN
作为我的父级(shell)过程,这会在下次需要接受输入时导致段错误。
这是我的“bg”功能的一部分。
ChildPID = fork();
if (ChildPID < 0) {
/* There is an error */
printf("Error forking the process.\n");
exit(1);
}
if (ChildPID >= 0) {
if (ChildPID == 0) { /* Child Process */
close(m_pipefd[0]);
dup2(m_pipefd[1], STDOUT_FILENO);
close(m_pipefd[1]);
//sleep(5);
err = execvp(optionsPTR[0], optionsPTR);
switch (errno) {
case ENOENT:
printf("RSI: %s: command not found\n", optionsPTR[0]);
break;
case EACCES:
printf("RSI: %s: Permission denied\n", optionsPTR[0]);
break;
}
exit(1);
}
else { /* Parent Process */
WaitErr = waitpid(ChildPID, &status, WNOHANG | WUNTRACED);
return(0); /* to main */
}
}
return 0;
以及代码,当我从过程完成后从管道输出。
close(m_pipefd[1]);
dup2(m_pipefd[0], STDIN_FILENO);
while(fgets(buffer, sizeof(buffer), stdin)) {
buf = buffer;
printf("%s\n", buf);
}
close(m_pipefd[0]);
所以文艺青年最爱的版本是,我需要捕捉孩子后重置回标准输入父进程处理的输出。
感谢,
布拉登
谢谢,我不知道我在想什么。这解决了它。 – Braden 2010-10-01 01:52:00