【发布时间】:2020-10-27 07:41:49
【问题描述】:
问题是父进程或子进程没有退出。子进程打印它的消息,然后程序挂起。可能会卡在 system() 因为当 system() 调用被删除时不会发生这种情况。 unhide_string() 过滤掉非字母并且 args 在别处定义。传递给 get_page() 的命令“cmd”是有效的。
int get_page(char* cmd) {
system(cmd);
return 0;
}
int main() {
char* args_s = unhide_string(args);
if (args_s == NULL) {
printf("Please run me again :)\n");
}
if (fork() == 0) {
get_page(args_s);
printf("Guess what I did :)\n");
}
free(args_s);
return 0;
}
【问题讨论】:
-
system在该过程完成之前不会返回。如果你打开的东西不会终止,你就会卡住。如果您需要更多控制权,请考虑使用自己的fork/exec。 -
好的,但这是命令:
curl --silent --output /dev/null wikipedia.org。在终端中运行它就可以了。那么系统不应该返回吗? -
你确定它挂了?您有两个进程:父亲立即完成并将手交还给显示提示的调用 shell。同时,孩子调用 system() 来运行命令,然后显示“猜猜我做了什么:)”。显示在shell提示显示后完成。但是如果你输入 return,你会得到另一个提示 no ?
-
它“退出”,因为工作目录再次打印,然后在旁边打印“猜猜我做了什么”消息,然后在其下方闪烁光标。该消息仅打印一次。