2017-04-16 87 views
0

在C中,運行外部程序並獲得此程序的PID的最佳方法是什麼? 我在這裏看到了一些有關使用fork()的答案......但據我瞭解,fork()副本的當前進程並創建一個子進程。如果可能的話,我想創建一個完全分離的上下文......而獲得PID的原因是爲了在未來完全取消這個過程。當我的服務器可以發送命令來啓動客戶端上的某些程序時,我正在構建一個客戶端/服務器程序。這些程序是外部的,並且多於一個同名的c /可執行文件可以同時運行(這就是爲什麼我不能'嘗試'通過程序名找到pid的原因)。另外,這些程序應該以'後臺'運行......我的意思是,我無法鎖定我的調用函數。 我不確定fork()會在這種情況下幫助我。C - 在後臺啓動外部程序並獲得pid

+0

研究這個線程:http://stackoverflow.com/questions/5883462/linux-createprocess#5884588 – cmks

+0

您可以使用守護進程(3)和其他deamons一樣安全pid到某些文件 – fghj

+1

使用'fork()'加上一個'exec *()'函數是正常的方法。如果您需要重新組織I/O或關閉管道描述符或其他任何內容,它比'posix_spawn()'更直接。你可以用'posix_spawn()'來操縱那些,但這很難。 –

回答

0

我喜歡做的是使用posix_spawn。這是很容易比fork使用和IMO感覺很多更直觀:

#include <spawn.h> 
#include <string.h> 
#include <stdio.h> 

extern char **environ; 

int main() { 
    pid_t pid; 
    char *argv[] = {"gcc", "file.c" (char*)0}; 

    int status = posix_spawn(&pid, "/usr/bin/gcc", NULL, NULL, argv, environ); 
    if(status != 0) { 
     fprintf(stderr, strerror(status)); 
     return 1; 
    } 
    return 0; 
} 
+0

這看起來正是我所需要的!我會在這裏測試並報告:) Tks! –

+0

只有一個小問題....我不能殺死這個進程:(我在做什麼錯誤?我已經改變了命令直接打開可執行文件(沒有'sh'),一切工作正常,PID返回我可以用htop確認pid是正確的,但是我發送的每一個信號(使用C或者命令行)都沒有做任何事情,程序仍在運行。 –