程序要求在分支/执行背景后回车

时间:2012-10-29 06:33:45

标签: c exec fork hang enter

因此,对于一项任务,我们需要构建一个shell,除其他外,还要模拟&命令行操作符。

我已经得到了分析/执行,问题是在execv终止后,用WNOHANG调用waitpid导致我的程序挂起。一旦我按下Enter键,提示会回来,程序正常工作。请注意,阻塞waitpid不会发生这种情况。

以下是相关代码:

782   pid_t child = fork();  //Create child process
783   
784   char** charArgs = toCharMatrix(*args);
785   
786   //If creation failed, say so
787   if(child == -1) {
788     fprintf(stderr, "Error: Could not create child process.\n");
789     return -1;
790   } 
791   else if(child == 0) {  //else: child process code
792     
793     //If the given command can be executed, attempt to exectue it
794     if(access(charArgs[0], X_OK) == 0) 
795       execv(charArgs[0], charArgs); 
796     else { //Else tell the user that they are an idiot
797       fprintf(stderr, "%s is not a valid path.\n", charArgs[0]);
798       return -1;
799     } 
800     
801     _exit(0);
802   } 
803   else
804     waitpid(-1, NULL, WNOHANG);

我在最后的else语句(父进程代码)中尝试了很多东西,从返回到基本上任何东西。似乎没有任何帮助。再一次,只需删除WNOHANG选项即可解决问题,但不符合分配规范。

我也叫waitpid(-1,NULL,WNOHANG);在显示提示之前的主循环中,以避免任何僵尸儿童。这个愚蠢的回车问题是唯一存在的问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

它实际上不太可能挂在waitpid上。尝试打印waitpid调用的返回码(以及errno或strerror(errno))。您的代码段未显示挂起的位置。程序想要返回按下的最可能的原因是,你调用一个读取stdin的函数(或父进程阻塞等待,并且子进程等待返回按下)。