Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C实现shell_C_Shell_Unix_Fork_Pipe - Fatal编程技术网

用C实现shell

用C实现shell,c,shell,unix,fork,pipe,C,Shell,Unix,Fork,Pipe,我目前正在用C实现一个shell。 当我尝试运行这样的命令时,会出现问题: SHELL$: sort < txtFile | grep key 我在子进程中运行sort

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

SHELL$: sort < txtFile | grep key
我在子进程中运行
sort
,在父进程中运行管道右侧的命令

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

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

/*shell的工作原理*/
/*  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);

    }

}
#包括 #包括 主(内部argc,字符**argv) { 如果(argc<2) { fprintf(stderr,“\n用法:./a.out cmd[options]…\n”); } 如果(!fork()) { argv++; execvp(argv[0],argv); } }
@KerrekSB感谢您的反馈,但我正试图弄清楚我的代码是怎么回事。非常感谢您的回答,因为您在父进程和子进程中都调用了
exec
,所以shell本身不再存在。太好了!!这就是我一直在寻找的信息类型。因此,当您说我需要fork两次时,这意味着在执行第一个命令=sortsort@Useless你能详细说明一下怎么做吗?
/*  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);

    }

}