在C中实现shell

前端之家收集整理的这篇文章主要介绍了在C中实现shell前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正在C中实现一个 shell.
当我尝试运行这样的命令时,我的问题出现了:
SHELL$: sort < txtFile | grep key

我正在运行sort< txtFile在进程(子进程)和父进程中,否则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);
}

解决方法

I’m running sort < txtFile in the child process,and in the parent I’m running the command to the right of the pipe.

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

您需要fork()两次,并在子进程中执行管道的两侧.父必须保留shell,然后在呈现下一个命令提示符之前wait()让子进程退出.

猜你在找的C&C++相关文章