【发布时间】:2012-03-20 22:00:41
【问题描述】:
我在 C 中实现了简单的 shell 模拟器。它应该支持在后台运行命令(例如 sleep 5s &)。因此,我使用 fork() -> exec() 序列运行此命令,并使用 SIGCHLD 信号处理程序等待该命令完成。我的问题是,是否有可能获得在 exec() 调用中指定的进程命令(名称)。我举个例子:
//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
....
}
我需要的是以某种方式访问命令的名称,它是在信号处理程序中的 exec() 调用中指定的(参见 execl("sleep", "sleep", "5s");)(参见 signalhandler(int sig) ) 输出类似 [PID] Done: sleep.
我不能使用上次运行命令的简单全局变量,因为在后台运行某些命令后,前台会出现更多新命令,并将重写该全局变量。示例:
> 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
>
有什么办法吗?非常感谢!
【问题讨论】:
-
/prod/<pid>/cmdline或/proc/self/cmdline? :S