我有一个应用程序,其中父进程启动几个线程(插件)。其中一个定期启动子进程并使用popen
通过管道读取其输出。
此外,SIGUSR1可以停止父进程。除了使用管道的插件外,所有插件都停止运行:它将SIGSEGV抛出到read
函数中的某个位置。
我认为这是因为子进程也在SIGUSR1上停止,因此管道变得无效。我对吗?我该如何解决这个问题?
答案 0 :(得分:0)
看起来导致SIGSEGV的错误发生在另一个地方:在我之前有人以这种方式编写了unload
函数:
void unload()
{
stop_main_thread = 1;
usleep(100000);
LibLog::print("modem is disconnected");
}
虽然线程函数有一个usleep(pause)
,但pause
设置为500000。
unload
函数放在一个共享库中,并在程序即将关闭时调用。因此,当unload
函数完成时,so-file被卸载,线程函数尝试用已知结果做一些事情。
将usleep
中的unload
来电更改为pthread_join
解决了我的问题。