C - 在后台启动外部程序并获取 pid
Posted
技术标签:
【中文标题】C - 在后台启动外部程序并获取 pid【英文标题】:C - start external programa in background and get pid 【发布时间】:2017-04-16 17:45:57 【问题描述】:在 C 中,运行外部程序并获取该程序的 PID 的最佳方法是什么? 我在这里看到了一些关于使用 fork() 的答案......但据我所知,fork() 复制了当前进程并创建了一个子进程。如果可能的话,我想创建一个完全分离的上下文......并且获得 PID 的原因是在未来完全终止这个过程。当我的服务器可以发送命令以在客户端上启动某些程序时,我正在构建一个客户端/服务器程序。这些程序是外部的,并且可以同时运行一个以上具有相同名称/可执行文件的 c(这就是为什么我不能“尝试”通过程序名称查找 pid)。此外,这些程序应该在“后台”运行......我的意思是,我不能锁定我的调用函数。 我不确定 fork() 在这种情况下是否会帮助我。
【问题讨论】:
研究这个话题:***.com/questions/5883462/linux-createprocess#5884588 你可以使用 daemon(3) 和安全的 pid 到某个文件,就像其他的守护进程一样 使用fork()
加上exec*()
函数之一是执行此操作的正常方法。如果您需要重新组织 I/O 或关闭管道描述符或其他任何内容,它比 posix_spawn()
更直接。你可以使用posix_spawn()
来操作它们,但这很辛苦。
【参考方案1】:
我喜欢使用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;
【讨论】:
这看起来正是我需要的!我会在这里测试和报告:) Tks! 只有一个小问题....我无法杀死这个进程:(我做错了什么?我已经更改了直接打开可执行文件的命令(没有'sh')和所有内容工作正常,返回 PID,我可以使用 htop 确认 pid 是正确的。但是我发送的每个信号(使用 C 或命令行)都没有做任何事情,进程仍在运行。以上是关于C - 在后台启动外部程序并获取 pid的主要内容,如果未能解决你的问题,请参考以下文章