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重定向
- 您需要小心确保关闭了足够多的管道文件描述符(通常在完成时已经关闭了所有描述符)
- 给定管道
,父shell将等待哪个或多个进程?都是吗?就第一个?就最后一个?为什么?排序文件1文件2 | uniq-c | sort-n
- 上一点的决定将影响父级中打开的管道数量与子级打开的管道数量。您始终可以在父级中设置所有需要的管道,并让每个人都执行大量关闭操作。如果只等待最后一个进程,则可以进行优化,以使链中的给定进程最多打开其输入管道和输出管道。这不是小事,而是可行的