我想在 Linux 中创建一个需要终止另一个进程的守护进程。我已经创建了守护进程并且它工作正常,但是我的第二个进程已创建但它没有按预期运行。
在开始新流程时我是否遗漏了什么?
这是我的代码
void StartWSDevice()
{
pid_t pid;
int status;
fflush(NULL);
pid = fork();
switch (pid) {
case -1:
perror("fork");
break;
case 0: {
syslog(LOG_NOTICE, "WSDevice started.");
int res = execl("home/pi/projects/WSDevice/bin/ARM/Debug",
"WSDevice.out", (char *)0);
syslog(LOG_NOTICE, "WSDevice return %d.", res);
break;
}
default:
fflush(NULL);
if (waitpid(pid, &status, 0) != -1) {
syslog(LOG_NOTICE, "Child exited with status %i\n", status);
} else {
perror("waitpid");
}
break;
}
}
int main(void) {
deamonize();
syslog(LOG_NOTICE, "WSDeviceService started.");
while (!stopService) {
// Check if my child process is running
int pid_file = open("/var/run/WSDevice.pid",
O_CREAT | O_RDWR, 0666);
int rc = flock(pid_file, LOCK_EX | LOCK_NB);
if (rc) {
if (EWOULDBLOCK == errno) {
}
} else {
StartWSDevice(); // Its not running, start it
}
sleep(30); /* wait 30 seconds */
}
syslog(LOG_NOTICE, "WSDeviceService terminated.");
exit(EXIT_SUCCESS);
}
最佳答案
您错误地使用了 execl
。 execl()
的第一个参数是要运行的进程。其余参数是传递给进程的 argv
数组的内容。这里的关键是 argv[0]
应该是正在运行的进程的名称。所以:
int res = execl("/home/pi/projects/WSDevice/bin/ARM/Debug/WSDevice.out",
"/home/pi/projects/WSDevice/bin/ARM/Debug/WSDevice.out",
NULL);
请注意,我还在 home
前面插入了 /
。这对您来说可能很重要。我还使用了 NULL
而不是 (char *)0
,这更像是一种风格,不会改变功能。
关于c++ - 从恶魔创建一个 fork 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909749/