簡體   English   中英

在c中為shell創建后台進程

[英]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

您應該使用xtermxeyes等多個實例程序進行測試。

其次,您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM