2017-08-27 40 views
0

我想在Linux中创建一个需要关闭另一个进程的deamon。我已经创建了deamon并且工作正常,但我的第二个进程已创建,但未按预期运行。从deamon创建一个分叉进程

在启动新过程中是否存在缺少的某些内容?

这是我的代码

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

回答

1

您使用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,这是更具风格的东西,并没有改变功能。

+0

通过它的名字,我也猜测'Debug'是一个目录,而不是二进制文件,这将是execl的另一个错误用法。 – hvd

+0

WSDevice.out是二进制文件,Debug是一个目录是 – Jaques

+0

@Jaques:我已经更新了我的答案,以说明您的新信息。 –