首页 > 解决方案 > 调用 system() 后子进程挂起

问题描述

问题是父进程或子进程都没有退出。子进程打印它的消息,然后程序挂起。可能会卡在 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;
}

标签: cfork

解决方案


通过让父进程等待子进程完成来修复。这允许程序正确终止。

修改后的分叉代码:

if (fork() == 0) {
    get_page(args_s);
    printf("Guess what I did :)\n");
} else {
    waitpid(-1, NULL, 0);
}

推荐阅读