【问题标题】:implementing a shell in C在 C 中实现一个 shell
【发布时间】:2013-11-25 08:03:59
【问题描述】:

我目前正在用 C 实现一个 shell。 当我尝试运行这样的命令时出现了我的问题:

SHELL$: sort < txtFile | grep key

我在一个进程(子进程)中运行sort &lt; txtFile,并在父进程(即else if(pid &gt; 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);
}

【问题讨论】:

  • @KerrekSB 感谢您的反馈,但我正试图弄清楚我的代码发生了什么。非常感谢您的回答
  • 你在父子进程中都调用了exec,所以shell本身已经不存在了。

标签: c shell unix fork pipe


【解决方案1】:

我在子进程中运行sort &lt; txtFile,在父进程中运行管道右侧的命令。

那么,你的 shell 进程会发生什么?父进程是shell。通过在父进程中运行右侧命令,您可以让它接管 shell 的进程。请记住 exec() 会替换当前进程。

您需要 fork() 两次,并在子进程中执行管道的两侧。父级必须保留 shell,然后等待子级退出,然后再显示下一个命令提示符。

【讨论】:

  • 太棒了!这就是我正在寻找的信息类型。所以当你说我需要 fork 两次时,这意味着在我执行第一个命令 = sort
  • 只需编写一个函数,该函数采用单个管道阶段命令(即,either sort&lt;txtFile or grep key),以及 fork 和 execs它。为管道中的两个阶段中的每个阶段调用一次此函数。
  • @Useless 你能详细说明一下如何做到这一点吗?
【解决方案2】:
/*  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);

    }

}

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多