在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()'来操纵那些,但这很难。 –