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

时间:2012-02-14 23:28:19

标签: linux shell posix

我编写了一个程序来获取命令行参数,例如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()也是如此,但我如何在同一个程序中一起完成?

1 个答案:

答案 0 :(得分:1)

有很多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?
  6. 如果你努力尝试,你可能会想出更好的选择。


    您需要解决许多问题:

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