1

我在 C 中创建了历史命令,它存储和从文件中获取命令。现在我正试图通过管道在它上面运行“头”。即历史| 头-3

为此,我首先 dup2() 将标准输出写入管道末端。然后使用 printf 打印历史记录(obv 不会显示在屏幕上)。现在,我已将标准输入重定向到读取该管道和 execvp() 头命令。它正确显示前 3 行。但它仍在等待用户输入。我必须按 Ctrl C 终止。知道为什么会这样。即使我在显示历史记录后尝试将所有内容刷新到标准输出中。似乎没有任何效果。

pid=fork();
if(pid==0){
    if(...first time..){
        if(dup2(fd[1],1)<0){
              printf("Error in Dup!!");
        }
        printHistory();
        for(k = 0;k < totalfds; k++){
              close(fd[k]);
        }
        return;
    }
    if(...second time..){
        if(dup2(fd[0],0)<0){
            printf("Error in Dup!!");
            }
    }   
    ...
    execvp(subcomm[0],subcomm);
    ...
}
4

1 回答 1

1

命令未在 EOF 上终止的常见问题是您没有关闭足够的文件描述符。如果该head命令仍然打开了管道的写入文件描述符,那么它可能会尝试读取并将挂起,因为管道的写入端是打开的——即使它是打开它的head进程并且它不会写入,直到读取返回。

此外,您的孩子完成后printHistory()可能应该exit(0)(或可能_exit(0))做——而不是回来。如果它返回,它可能会回到读取循环。execvp()如果失败,您还应该确保退出进程(状态非零) 。永远不需要检查函数execvp()或其他成员的返回状态exec*()。如果他们回来了,他们就失败了;如果他们成功了,原来的进程会被新的进程替换,并且函数永远不会返回。

此外,作为一般性评论,请以换行符结束您的消息;它有助于确保它们及时出现。还可以考虑将错误消息发送到stderr而不是stdout.

于 2013-09-12T23:43:05.317 回答