[英]Creating a background process for shell in c
我試圖在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不會等待它們關閉。
我希望我能夠正確地解釋我的問題,我的英語不是那么好,所以對於錯誤感到抱歉。 如果我需要提供更多信息,請告訴我。 謝謝。
這里有兩個問題:
首先,gedit和firefox是單實例程序。 任何其他調用都只會重用現有實例。 你在bash中看到同樣的事情:
bash$ gedit & # Starts gedit and returns immediately
bash$ gedit # Opens a new tab in the existing window and returns immediately
您應該使用xterm
或xeyes
等多個實例程序進行測試。
其次,您的wait(NULL)
調用等待任何進程關閉,不一定是最后一個進程。 在你的shell中,你可能會看到:
yourshell$ xterm & # starts xterms and returns immediately.
# Now close the xterm before running the next command
yourshell$ xeyes # starts xeyes, waits on xterm, returns immediately
您可以使用waitpid(cpid, NULL, 0)
來等待正確的進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.