首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从进程中提取命令(使用PID)

从进程中提取命令(使用PID)
EN

Stack Overflow用户
提问于 2012-03-02 19:37:44
回答 1查看 502关注 0票数 1

我正在用C实现一个简单的shell模拟器,它应该支持在后台运行命令(例如。睡眠5s &)。因此,我使用fork() -> exec()序列运行该命令,并使用SIGCHLD信号处理程序等待该命令完成。我的问题是,如果有可能获取进程命令(name),这是在exec()调用中指定的。我给你举个例子:

代码语言:javascript
运行
复制
//SIGCHLD signal handler (use for notification, when background process ends)
void sighandler(int sig) {
    int status;
    int pid = waitpid(-1, &status, WNOHANG);

    if (WIFEXITED(status)) {
        if (pid != -1 && pid != 0) {
            printf("\n[%d] Done: \n> ", (int) pid); //also need to provide user name (command) of exited process (ex. [PID] Done: sleep)
            fflush(stdout);
        }
    }
}

pid_t fork_pid = fork()

if (fork_pid == 0) { //child
    execl("sleep", "sleep", "5s");
} else { //parent
    ....
}

我需要的是命令的访问名,它是在信号处理程序(参见signalhandler(int sig))中的exec()调用(参见execl(" sleep ","sleep","5s");)中指定的,以输出类似PID Done: sleep的内容。

我不能使用上一次运行的命令的简单全局变量,因为在后台运行某些命令后,可能会在前台出现更多新命令,并会重写全局变量。示例:

代码语言:javascript
运行
复制
> sleep 1m & //background command - variable is "sleep"
[PID of sleep process] Running in background
> ls //foreground command - variable is "ls"
> cat output //foreground command - variable is "cat"
.
.
.
[PID of sleep process] Done: sleep
>

有什么办法做到这一点吗?非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-02 19:57:08

您可以创建一个列表以将pids与命令相关联:

代码语言:javascript
运行
复制
void sighandler(int sig) {
            ...
            char *cmd = task_list.get(pid);
            printf("\n[%d] %s, Done: \n> ", (int) pid, cmd);
            ...
}

...    

pid_t fork_pid = fork();
char command[1024] = "sleep";
if (fork_pid == 0) { //child
      execl(command, command, "5s");
} else { //parent
      task_list.insert(pid, command);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9532634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档