【问题标题】:Program goes into infinite loop when using the fork() call in C在 C 中使用 fork() 调用时程序进入无限循环
【发布时间】:2017-08-28 22:23:20
【问题描述】:

我现在遇到了这个奇怪的问题,基本上我正在尝试并行执行两个函数。

出现这个问题的小代码sn-p有这个目的:只要父函数/进程没有完成自己的任务,子函数就监听一些事件,以防子进程发生新事件/function 子进程应该终止整个程序。

这里是示例代码sn-p:

#include<stdio.h>
#include<stdlib.h>

void send();

int main(void)
{
    send();
}

void send()
{

    if( fork() ) { /*child process */

            keep_checking_status(); /*listens to audio related events, and terminate the whole program when some                specific kind of event occurs */
    }
    else {
        /* Parent Process */
        /* The parent process executes different other functions, lines of code here */
        /* code lines */
        func1();
        func2();
        func3();
        func4(); 
        /* More lines of code */

        /* And when no event occurs in the child which means the program is still running and the parent process almost executed all the code it was supposed to do, so finally exit(0); */      
        exit(0); 
    }

}    

现在的问题是,父进程不是只执行一次父进程,而是进入无限状态,并且不会执行所有代码以到达最后一行 func4()exit(0); 并和平终止.

再次,我希望子进程监听我处理过的一些特定音频事件,而父进程应该只执行其中的代码行并退出。

父进程也没有while循环,只是一段代码,执行和计算一些其他的东西,所以感觉很奇怪。

我确实研究了一些 fork() 使用方式不同的示例,我尝试了它们但仍然是同样的问题。

编辑:(已解决): 重命名函数void send()后就ok了;到 void send11(); ,它现在可以按我的意愿工作了。 似乎我正在使用的库,即 libcurl 等具有像 send() 这样的功能,或者它们已经包含了所有 send() 的 linux 系统,这为我创造了这个问题。我的错。 如果有人可以回答为什么这种从不终止的行为,请发布您的详细答案,因为通常编译器会报告名称冲突,但在我的情况下它没有报告任何错误,而是程序进入无穷大。

【问题讨论】:

    标签: c linux shell pthreads fork


    【解决方案1】:

    父进程永远运行,因为:

    1) 你的 cmets 倒退了。父母打电话给keep_checking_status,而不是孩子。 fork 函数将零返回给子级,因此 if( fork() ) 在父级中为真(返回非零值)。

    2) 孩子没有阻止它。正如文档所述,exit 函数终止调用进程。所以父母将永远留在keep_checking_status

    修复可能是修复逻辑,以便颠倒父子角色并将子角色的 PID 保存在父节点中,以便完成后您可以kill 它。

    【讨论】:

    • 我也是这样做的,即 'pid_t child; if( (child=fork()==0 ) { keep_checking_status() } else { /* parent proc */ } ' 但仍然是同样的问题。
    • 我认为你的意思是if( (child = fork()) == 0 )。你为什么要为难自己呢?为什么不:pid_t child = fork(); if (pid == 0) ...——这很容易理解。这就像你试图让你的代码难以理解。
    • 已编辑问题,请回来查看。 :)
    • 进程永远不会终止,因为它是一个无限循环。完成后,您需要让父母杀死孩子。这就是你保存 pid 的原因。
    • 对不起,我不认为如果我能像你所说的那样颠倒逻辑会更健壮,因为它对我有用,我使用了其他不必要的方法来终止我认为的“孩子”以前作为“父母”,我猜我有两个问题。谢谢。
    【解决方案2】:

    你的问题是因为你把父进程和子进程搞混了,导致父进程一直运行不停止。

    引用自 fork 的手册页:

    成功时,在父进程中返回子进程的PID, 并且在孩子中返回 0。失败时,-1 在 parent,没有创建子进程,并且设置了适当的errno。

    所以您的 0 是父级,在您的情况下它正在运行 keep_checking_status() 函数。

    你只需要稍微颠倒一下你的逻辑就可以了。

    【讨论】:

      猜你喜欢
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 2013-09-09
      • 2021-08-12
      相关资源
      最近更新 更多