【发布时间】:2015-10-22 05:45:22
【问题描述】:
我正在编写一个 Linux 守护程序来执行我的代码。我的代码调用了第三方库。如果我从父级执行我的代码,那么一切运行正常,但如果我直接从一个子级执行我的代码,则对第三方库的调用永远不会返回。如果我创建了第二个可执行文件来执行我的代码,并且我让守护进程运行该可执行文件,那么一切都运行良好。
为什么我不能从子进程调用我的代码?
int main(void)
{
// Our process ID and Session ID
pid_t pid, sid;
fflush(stdout);
// Fork off the parent process
pid = fork();
if (pid < 0)
exit(EXIT_FAILURE);
// If we got a good PID, then we can exit the parent process.
if (pid > 0)
exit(EXIT_SUCCESS);
// Change the file mode mask
umask(0);
// Open any logs here
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
if (open("/dev/null",O_RDONLY) == -1)
exit(EXIT_FAILURE);
if (open("/dev/null",O_WRONLY) == -1)
exit(EXIT_FAILURE);
if (open("/dev/null",O_WRONLY) == -1)
exit(EXIT_FAILURE);
// Create a new SID for the child process
sid = setsid();
if (sid < 0)
exit(EXIT_FAILURE);
// Change the current working directory
if ((chdir("/")) < 0)
exit(EXIT_FAILURE);
// doesn't work
MyObject ob;
ob.start();
// works
//execlp("/home/root/NextGenAutoGuidance", "NextGenAutoGuidance", (char*)NULL);
while(1)
{
sleep(60);
}
exit(EXIT_SUCCESS);
}
我尝试将我的对象的对象声明作为全局和静态全局,我也尝试过对我的对象进行新建/删除。
调用第三方库返回的唯一方法是我的对象是从父进程启动的。
如何创建守护程序,这样我就不必调用外部二进制文件来正确运行?
编辑
我需要补充一点,我也尝试过不杀死父母,我也遇到了同样的问题。
【问题讨论】:
-
库代码有什么作用?它不工作的症状是什么?
-
处理CAN总线通信,不是cansocket库
-
关于
MyObject的分配,如果你尝试new MyObject和ob->start(),子进程会成功吗? -
不,我也试过了。
-
嗯。如果你将
MyObject结构移到fork 之前?