【问题标题】:fork() system call and while loopfork() 系统调用和while循环
【发布时间】:2013-10-24 23:43:43
【问题描述】:

关于循环内fork() 行为的问题。当fork() 被调用时,假设wait() 未被调用,父进程应该继续执行代码并循环回到顶部,提示您输入q 以退出。由于pid 应该等于孩子的 ID 而不是 0,所以分叉的孩子应该立即打印它的 ID 和中断。相反,它会进入无限循环。

谁能告诉我我在误解什么?

int main (int argc, char *argv[])
{
    char run[2];
    int pid=0;
    while (run[0]!= 'q')    
    {
         printf("Type q to quit \n");
         fgets (run, 2, stdin);
         pid=fork();
         //wait();
         printf("child ID: %i\n", pid);
         if(pid!=0) { break;}
    }
    
}

【问题讨论】:

    标签: c linux fork system-calls


    【解决方案1】:

    您混淆了fork() 的返回值。 child 获得0,而父母获得孩子的 PID。

    编者注:您的程序在循环的第一次迭代中导致未定义的行为,因为您没有初始化 run。您可能也应该检查fgets 的返回值。

    【讨论】:

    • 我在商业和开源代码库中多次遇到过未定义的行为错误。它是邪恶的,因为它几乎总是正常工作,直到有一次堆栈确实包含“q”或 -1 或任何它。
    • fgets() 之后打印run 的值也很有用,因为您将一次获得一个字符,首先是您键入的字符,然后是换行符等。
    猜你喜欢
    • 2023-03-07
    • 2015-07-16
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2013-10-09
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多