簡體   English   中英

在C中實現shell

[英]implementing a shell in C

我目前在C中實現一個shell。當我嘗試運行這樣的命令時,我的問題出現了:

SHELL$: sort < txtFile | grep key

我在進程(子)和父進程中運行sort < txtFileelse if(pid > 0)我正在運行管道右側的另一個命令。

該程序運行正常,但它退出我在main中設置的無限循環,以保持接收用戶的輸入。

我怎么能解決這個問題?

這是我到目前為止處理管道的代碼,我沒有包含我必須處理重定向的代碼:

c2p是我為此設置的管道。

if(pid == 0)
{
  if( PIPE_FLAG )
    {   
        close(c2p[0]);
        if(dup2(c2p[1], STDOUT_FILENO) == -1){
            perror("dup2() failed");
            exit(2);
        }
    }

    /* Execute command */
    execvp(cmd_args[0], cmd_args);
    perror("exec failed 1. ");          /* return only when exec fails */
    exit(-1);

} 
else if(pid > 0)
{
  if(PIPE_FLAG)
    {
        close(c2p[1]);
        if(dup2(c2p[0], STDIN_FILENO) == -1){
            perror("dup2() failed");
            exit(-1);
        }
        execvp(nxt_args[0], nxt_args);
        perror("exec failed 2. ");          
        exit(-1);    
    }
}
else 
{ 
    /* error occurred */
    perror("fork failed");
    exit(1);
}

我正在子進程中運行sort < txtFile ,而在父進程中我正在運行管道右側的命令。

那么你的shell進程會發生什么? 父進程是shell。 通過在父進程中運行右側命令,您可以接管shell的進程。 請記住,exec()替換當前進程。

您需要fork()兩次,並在子進程中執行管道的兩側。 父必須保留shell,然后wait()等待孩子退出,然后再顯示下一個命令提示符。

/*  How shell works */
#include<stdio.h>

#include<unistd.h>

main (int argc, char **argv)
{

  if (argc < 2)
    {

      fprintf (stderr, "\nUsage: ./a.out cmd [options]...\n");

    }

  if (!fork ())
    {

      argv++;

      execvp (argv[0], argv);

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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