【问题标题】:Program requires carriage return after forking/exec-ing to background程序在分叉/执行到后台后需要回车
【发布时间】:2012-10-18 11:43:13
【问题描述】:

因此,对于分配,我们需要构建一个 shell,其中包括模拟 & 命令行运算符。

我已经停止了分叉/执行,问题是使用 WNOHANG 调用 waitpid 会导致我的程序在 execv 终止后挂起。一旦我按回车,提示就会回来,程序正常工作。请注意,阻塞的 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 的手册页,根据手册页验证您是否为其提供了有效参数,并检查了 WNOHANG 的作用?
  • 根据我正在阅读的手册页:“如果没有孩子退出,WNOHANG 立即返回。”其他参数告诉它等待任何子进程,而 NULL 只是我不需要的状态信息的占位符。我看不出这有什么帮助。
  • 换句话说,它实际上不太可能挂在 waitpid 上。尝试打印 waitpid 调用的返回码(和 errno 或 strerror(errno))。无论如何,所以你的剪辑没有显示它挂在哪里。程序想要返回键的最可能原因是,您调用了一个读取标准输入的函数(或父进程确实阻塞等待,而子进程等待返回键)。
  • 原来如此。发现问题。结果证明程序正在按照我的要求做,只是一个菜鸟错误(这是我处理多进程/线程编程的第一个任务)。感谢您让我摆脱 waitpid 非问题。我从阻塞 waitpid 起作用并被固定这一事实得出了错误的结论。 :P

标签: c exec fork freeze enter


【解决方案1】:

它实际上不太可能挂在 waitpid 上。尝试打印 waitpid 调用的返回码(以及 errno 或 strerror(errno))。你的 sn-p 没有显示它挂在哪里。程序想要返回键的最可能原因是,您调用了一个读取标准输入的函数(或父进程确实阻塞等待,而子进程等待返回键)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多