繁体   English   中英

程序在分叉/执行到后台后需要回车

[英]Program requires carriage return after forking/exec-ing to background

因此,对于一项分配,我们需要构建一个外壳程序,其中该外壳程序可以模拟&命令行运算符。

我的派生/执行失败了,问题是在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); 在显示提示之前的主循环中,可以避免任何僵尸孩子。 这个愚蠢的回车问题是唯一剩下的问题。 提前致谢。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM