在C中,運行外部程序並獲得此程序的PID的最佳方法是什麼? 我在這裏看到了一些有關使用fork()的答案......但據我瞭解,fork()副本的當前進程並創建一個子進程。如果可能的話,我想創建一個完全分離的上下文......而獲得PID的原因是爲了在未來完全取消這個過程。當我的服務器可以發送命令來啓動客戶端上的某些程序時,我正在構建一個客戶端/服務器程序。這些程序是外部的,並且多於一個同名的c /可執行文件可以同時運行(這就是爲什麼我不能'嘗試'通過程序名找到pid的原因)。另外,這些程序應該以'後臺'運行......我的意思是,我無法鎖定我的調用函數。 我不確定fork()會在這種情況下幫助我。C - 在後臺啓動外部程序並獲得pid
0
A
回答
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或者命令行)都沒有做任何事情,程序仍在運行。 –
相關問題
- 1. 獲取在後臺遠程啓動的作業的pid
- 2. 捕獲由Makefile啓動的後臺進程的PID
- 3. 如何獲得在c程序中使用system()啓動的進程的PID
- 4. ssh在後臺運行腳本並獲得其pid
- 5. qprocess啓動外部程序
- 6. 殺死應用程序並啓動後,它在後臺運行
- 7. C# - 在後臺啓動進程
- 8. 獲得在C#創建進程的PID
- 9. Android應用程序在後臺啓動
- 10. 以PHP啓動的外部進程的PID
- 11. golang exec後臺進程並獲取其pid
- 12. 如何在C#中啓動應用程序的PID#
- 13. 是否可以從控制檯外部啓動node.js程序?
- 14. iOS在啓動時啓動後臺應用程序
- 15. 在後臺啓動我的控制檯應用程序
- 16. 從asp.net啓動外部程序
- 17. 在C#/ Unity中啓動外部Android應用程序
- 18. 使用python啓動進程並獲取PID(Linux)
- 19. C#運行外部控制檯應用程序,並沒有ouptut?
- 20. 用Java啓動外部程序?
- 21. C#啓動外部進程,並保持運行
- 22. grep啓動後臺進程
- 23. 獲得子進程的PID
- 24. iPad:在應用程序啓動時啓動外部應用程序
- 25. 在Ruby中創建後臺進程並註冊PID
- 26. 在程序啓動時在後臺執行動作
- 27. (安卓)在外部應用程序啓動文件,並從外部應用程序
- 28. 設備重啓後在後臺自動運行應用程序
- 29. C#獲得啓動進程後的窗口句柄
- 30. 我的視覺c#2010表達無需啓動外部程序
研究這個線程:http://stackoverflow.com/questions/5883462/linux-createprocess#5884588 – cmks
您可以使用守護進程(3)和其他deamons一樣安全pid到某些文件 – fghj
使用'fork()'加上一個'exec *()'函數是正常的方法。如果您需要重新組織I/O或關閉管道描述符或其他任何內容,它比'posix_spawn()'更直接。你可以用'posix_spawn()'來操縱那些,但這很難。 –