【发布时间】:2013-12-24 07:37:22
【问题描述】:
我试图用 C 语言制作自己的 shell,但在处理后台和前台进程时遇到了麻烦。这里是我创建流程的地方:
void call_exec(char *cmd)
{
pid_t cpid;
is_Background();
if(index(cmd, '/') == NULL) {
int i;
printf("cmd is %s\n", cmd);
cpid = fork();
if(cpid == 0) {
i = execvp(cmd, my_argv);
if(i < 0) {
printf("%s: %s\n", cmd, "command not found");
exit(1);
}
}
else {
if(!is_BG ) {
wait(NULL);
}
is_BG = 0;
}
}
is_Background:
void is_Background() {
if(strcmp(my_argv[arg_index], "&") == 0) {
is_BG = 1;
my_argv[arg_index] = NULL;
}
}
当我运行我的代码并在命令行中输入“gedit”时,shell 会一直等到我关闭 gedit 窗口,然后提示我输入新命令。当我输入“gedit &”在后台运行 gedit 时,它工作正常,gedit 窗口打开,shell 立即提示我输入新命令,而无需等待关闭 gedit 窗口。问题是,在我对任何命令只使用一次“&”之后,shell 永远不会等待任何前台进程结束/关闭。例如,如果我在没有 "&" 的情况下输入 "gedit" 或 "firefox" ,shell 不会等待它们关闭。
我希望我能正确解释我的问题,我的英语不是很好,很抱歉有错误。如果我需要提供更多信息,请告诉我。谢谢。
【问题讨论】: