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的主要内容,如果未能解决你的问题,请参考以下文章

如何获取我刚刚在 java 程序中启动的进程的 PID?

如何获取后台进程的进程ID?

如何在收到推送通知后让 android 应用程序在后台启动,以便它可以从服务器获取数据?

java获取cmd启动的程序的PID

android在后台获取位置并更新listview

C - 获取外部 IP 地址