Linux 用c实现的简单shell程序中的输入输出文件重定向和shell管道

Linux 用c实现的简单shell程序中的输入输出文件重定向和shell管道,linux,shell,posix,Linux,Shell,Posix,我编写了一个程序,可以获取命令行参数,如ls,cat,并执行它们。现在,我需要扩展这个程序以实现I/o重定向,并执行shell管道。 这是我的简单shell程序 if ((pid = fork()) == -1 ) { /* error exit - fork failed */ perror("Fork failed"); exit(-1); } if (pid == 0) { /* this is the child */ printf("This is the c

我编写了一个程序,可以获取命令行参数,如
ls
cat
,并执行它们。现在,我需要扩展这个程序以实现I/o重定向,并执行shell管道。 这是我的简单shell程序

if ((pid = fork()) == -1 ) { /* error exit - fork failed */ 
    perror("Fork failed");
    exit(-1);
}
if (pid == 0) { /* this is the child */
    printf("This is the child ready to execute: %s\n",argv[1]);
    execvp(argv[1],&argv[1]);
    perror("Exec returned");
    exit(-1);
} else {
    wait(pid,0,0);
    printf("The parent is exiting now\n");
    ...
}
我不知道如何在同一个程序中添加管道和重定向

dup(pipeID[0]);
close(pipeID[0]);
close(pipeID[1]);
execlp(argv[3],argv[3],argv[4],0); 

我知道我必须使用
dup()
dup2()
进行重定向和
pipe()
,但是我如何在同一个程序中一起完成这一切呢?

有许多问题可以解决其中的一些或所有问题。SO搜索缓冲区中更相关的搜索词是
[c][shell]
(标记shell和c)。问题包括:

  • 如果你更加努力,你可能会想出一个更好的选择


    您需要解决许多问题:

    • 需要在创建由管道连接的两个进程的分叉之前设置管道
    • I/O重定向可以在子级中完成(仅限)
    • 您需要解析命令行以将其拆分为命令名、参数和I/O重定向
    • 您需要小心确保关闭了足够多的管道文件描述符(通常在完成时已经关闭了所有描述符)
    • 给定管道
      排序文件1文件2 | uniq-c | sort-n
      ,父shell将等待哪个或多个进程?都是吗?就第一个?就最后一个?为什么?
    • 上一点的决定将影响父级中打开的管道数量与子级打开的管道数量。您始终可以在父级中设置所有需要的管道,并让每个人都执行大量关闭操作。如果只等待最后一个进程,则可以进行优化,以使链中的给定进程最多打开其输入管道和输出管道。这不是小事,而是可行的

    上有很多问题,因此可以在此处解决这些问题。我已经回答了其中一些问题。*是的。。我确实使用cp和null解析了命令行。我可以在同一个子进程中包含管道和文件重定向吗?