在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. 獲取在後臺遠程啓動的作業的pid
- 3. 獲取其他用戶啓動的後臺進程的PID
- 4. 捕獲由Makefile啓動的後臺進程的PID
- 5. 如何獲得在c程序中使用system()啓動的進程的PID
- 6. 啓動外部程序,但保持應用程序在前臺
- 7. 獲取啓動進程的PID C++
- 8. ssh在後臺運行腳本並獲得其pid
- 9. C++調用並等待外部程序並獲得結果
- 10. qprocess啓動外部程序
- 11. 如何通過nohup程序啓動時獲得pid?
- 12. 啓動外部程序python
- 13. Bash:運行後臺作業並獲得pid
- 14. C# - 在後臺啓動進程
- 15. 殺死應用程序並啓動後,它在後臺運行
- 16. 獲得在C#創建進程的PID
- 17. 啓動外部應用程序並等待它們啓動
- 18. 獲取後臺gnome-terminal進程的pid
- 19. Android應用程序在後臺啓動
- 20. 在後臺啓動應用程序
- 21. nsis安裝程序在後臺啓動
- 22. 在後臺啓動應用程序
- 23. 如何在前臺從Python腳本啓動外部程序?
- 24. 有什麼辦法可以啓動外部應用程序,並獲得應用程序的pid,並殺死他們使用java或php
- 25. 以PHP啓動的外部進程的PID
- 26. golang exec後臺進程並獲取其pid
- 27. 如何在後臺啓動並運行UWP應用程序
- 28. Xamarin.Forms Android應用程序在外部活動啓動後重新啓動
- 29. 如何在C#中啓動應用程序的PID#
- 30. C# - Windows窗體 - 將應用程序放在後臺並重新啓動它
研究這個線程:http://stackoverflow.com/questions/5883462/linux-createprocess#5884588 – cmks
您可以使用守護進程(3)和其他deamons一樣安全pid到某些文件 – fghj
使用'fork()'加上一個'exec *()'函數是正常的方法。如果您需要重新組織I/O或關閉管道描述符或其他任何內容,它比'posix_spawn()'更直接。你可以用'posix_spawn()'來操縱那些,但這很難。 –