2017-08-27 65 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:我已經更新了我的答案,以說明您的新信息。 –