Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中使用fork()调用时,程序进入无限循环_C_Linux_Shell_Pthreads_Fork - Fatal编程技术网

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

在C中使用fork()调用时,程序进入无限循环,c,linux,shell,pthreads,fork,C,Linux,Shell,Pthreads,Fork,我现在遇到了一个奇怪的问题,基本上我正在尝试并行执行两个函数 出现此问题的小代码段有这样一个目的:只要父函数/进程尚未完成自己的任务,子函数就会侦听某些事件,如果子进程/函数中发生新事件,则子进程应终止整个程序 以下是示例代码段: #include<stdio.h> #include<stdlib.h> void send(); int main(void) { send(); } void send() { if( fork() ) { /*ch

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

出现此问题的小代码段有这样一个目的:只要父函数/进程尚未完成自己的任务,子函数就会侦听某些事件,如果子进程/函数中发生新事件,则子进程应终止整个程序

以下是示例代码段:

#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); 
    }

}    
#包括
#包括
无效发送();
内部主(空)
{
send();
}
作废发送()
{
if(fork()){/*子进程*/
保持_checking_status();/*侦听与音频相关的事件,并在发生特定类型的事件时终止整个程序*/
}
否则{
/*父进程*/
/*父进程执行不同的其他函数,这里有几行代码*/
/*代码行*/
func1();
func2();
func3();
func4();
/*更多的代码行*/
/*当子进程中没有发生事件时,这意味着程序仍在运行,父进程几乎执行了它应该执行的所有代码,因此最后退出(0);*/
出口(0);
}
}    
现在的问题是,父进程不是只执行一次父进程,而是进入无限状态,并且不会执行所有代码以到达最后一行,即
func4()
exit(0)并和平终止

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

在父进程中也没有while循环,它只是一个执行和计算其他事情的代码,这就是为什么它感觉非常奇怪

我确实研究了一些不同用法的
fork()
示例,我尝试了它们,但仍然存在相同的问题

编辑:(已解决): 重命名函数
void send()
后,确定;取消send11(),它现在可以按我的要求工作了。 我正在使用的库,如libcurl等,似乎有一些函数,如
send()
,或者它们包含了linux系统all
send()
,这为我带来了这个问题。我的错。
如果有人能回答为什么这种永不终止的行为,请发布您的详细答案,因为编译器通常会报告名称冲突,但在我的例子中,它没有报告任何错误,而是程序进入无穷大。

父进程永远运行,因为:

1) 你的评论是反向的。父对象调用
保持检查\u状态
,而不是子对象。
fork
函数将零返回给子级,因此
if(fork())
在父级中为true(返回非零值)

2) 孩子没有阻止它。如文档所述,
exit
函数终止调用过程。因此,家长将永远停留在
keep\u checking\u status


修复方法可能是修复逻辑,使父角色和子角色颠倒,并将子角色的PID保存在父角色中,以便您可以在完成时
杀死它。

父进程永远运行,因为:

1) 你的评论是反向的。父对象调用
保持检查\u状态
,而不是子对象。
fork
函数将零返回给子级,因此
if(fork())
在父级中为true(返回非零值)

2) 孩子没有阻止它。如文档所述,
exit
函数终止调用过程。因此,家长将永远停留在
keep\u checking\u status


修复方法可能是修复逻辑,以便颠倒父进程和子进程的角色,并将子进程的PID保存在父进程中,以便在完成后
杀死它。

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

引用fork手册页中的内容:

成功时,在父进程中返回子进程的PID, 并且在子级中返回0。失败时,在中返回-1 父进程,不创建子进程,并且错误号设置正确

因此,您的0是父级,在您的情况下,它正在运行
keep\u checking\u status()
函数


您只需稍微颠倒一下逻辑,就可以了。

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

引用fork手册页中的内容:

成功时,在父进程中返回子进程的PID, 并且在子级中返回0。失败时,在中返回-1 父进程,不创建子进程,并且错误号设置正确

因此,您的0是父级,在您的情况下,它正在运行
keep\u checking\u status()
函数


你只需要稍微改变一下你的逻辑,你就会好起来。

我也是这样做的,即“pid\t child;如果((child=fork()==0){继续检查状态()}或者{/*parent proc*/}但仍然是同一个问题。我猜你的意思是
if((child=fork())==0)
。但是为什么你让事情变得困难呢?为什么不:
pid\t child=fork();if(pid==0)…
--这很容易理解。就像你试图让你的代码难以理解一样。编辑了问题,请回头检查。:)这个过程永远不会终止,因为它是一个无休止的循环。你需要让父母在孩子死后杀死他。这就是你保存pid的原因。对不起,我没有想到如果我能像你说的那样反转逻辑会更健壮,因为它对我有效。我使用了其他不必要的方法来终止我以前认为是“父”的“子”,我有两个问题