gpt4 book ai didi

c - 程序在 fork /执行到后台后需要回车

转载 作者:行者123 更新时间:2023-11-30 17:56:54 25 4
gpt4 key购买 nike

因此,对于作业,我们需要构建一个 shell,除其他外,它还要模拟 & 命令行运算符。

我已经停止了 forking/exec-ing,问题是使用 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 处。尝试打印 waitpid 调用的返回代码(以及 errno 或 strerror(errno))。您的代码片段不显示它卡在哪里。程序想要按回车键的最可能原因是,您调用一个读取 stdin 的函数(或者父进程执行阻塞等待,而子进程等待按回车键)。

关于c - 程序在 fork /执行到后台后需要回车,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13116899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com