gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:34:06 25 4
gpt4 key购买 nike

我编写了一个程序来获取命令行参数,例如 lscat 并执行它们。现在我需要扩展此程序以进行 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 问题可以解决部分或所有这些问题。 SO 搜索缓冲区中更相关的搜索词是 [c] [shell](标记 shell 和 C)。问题包括:

  1. Writing my own shell in C: how do I run Unix executables?
  2. Redirecting the output of a child process?
  3. How can I implement my own basic Unix shell in C?
  4. Writing Linux shell?
  5. Shell program and pipes in C?

如果您更加努力,您可能会想出更好的选择。


您需要解决许多问题:

  • 需要在创建由管道连接的两个进程的分支之前设置管道。
  • I/O 重定向可以在 child 中完成(仅)。
  • 您需要解析命令行以将其拆分为命令名称、参数和 I/O 重定向。
  • 您需要小心确保关闭足够的管道文件描述符(通常在您完成时关闭所有这些描述符)。
  • 给定一条管道 sort file1 file2 | uniq-c | sort -n,父shell要等待哪个或哪些进程?他们全部? 只是第一个? 只是最后一个?为什么?
  • 关于上一点的决定将影响父级打开的管道数与子级打开的管道数。你总是可以在父级中设置所有需要的管道,让每个人都做很多关闭。如果您只想等待最后一个进程,则可以进行优化,以便链中的给定进程最多打开其输入管道和输出管道。不简单,但可行。

关于linux - 用 c 实现的简单 shell 程序中的输入输出文件重定向和 shell 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9285787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com