在C中使用fork()调用时程序进入无限循环

时间:2017-08-28 22:23:20

标签: c linux shell pthreads fork

我现在有这个奇怪的问题,基本上我试图并行执行两个功能。

具有此问题的小代码片段具有以下目的:只要父函数/进程尚未完成其自己的任务,子进程侦听某些事件,如果子进程/函数中发生新事件子进程应该终止整个程序。

以下是示例代码段:

#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()或{{ 1}}并安然终止。

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

父进程中也没有while循环,它只是一个执行和计算其他东西的代码,这就是为什么它感觉很奇怪。

我确实调查了一些exit(0);使用不同的例子,我试过但仍然是同样的问题。

编辑:(已解决): 重命名函数fork()后确定;至void send(),它现在按我的意愿工作。 似乎我使用的库,如libcurl等,有一些函数,如void send11();,或者他们已经包含了所有send()的linux系统,这对我来说是个问题。我的错。 如果有人能够回答为什么这种永不终止的行为,请发布您的详细答案,因为通常编译器报告名称冲突,但在我的情况下,它没有报告任何错误,而是程序进入无限。

2 个答案:

答案 0 :(得分:3)

父进程永远运行,因为:

1)您的评论是倒退的。家长呼叫keep_checking_status,而不是孩子。 fork函数向子节点返回零,因此父节点中的if( fork() )为真(返回非零值)。

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

修复可能是修复逻辑,以便反转父级和子级角色并将子级PID保存在父级中,这样您就可以kill完成它。 / p>

答案 1 :(得分:1)

您的问题是因为您将父进程和子进程混淆,导致父进程永远运行而不会停止。

从fork的手册页引用:

  

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

所以你的0是父,在你的情况下运行keep_checking_status()函数。

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