2010-10-01 85 views
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]); 

所以文艺青年最爱的版本是,我需要捕捉孩子后重置回标准输入父进程处理的输出。

感谢,

布拉登

回答

3

通常没有必要惹你的父母stdin和stdout。将孩子中的管道连接到标准输入和标准输出后,管道的另一端应能够发送数据或从孩子获取数据。

刚刚从父母的m_pipefd [1]中读取。

+0

谢谢,我不知道我在想什么。这解决了它。 – Braden 2010-10-01 01:52:00

相关问题