在shell中实现重定向

时间:2014-05-27 04:15:02

标签: shell io-redirection

我正在从一些笔记中学习os,它提供了一个简单的shell代码如下:

while (1) {
    printf ("$");
    readcommand (command, args);
    // parse user input
    if ((pid = fork ()) == 0) { // child?
       exec (command, args, 0);
    } else if (pid > 0) {
    // parent?
    wait (0);
    // wait for child to terminate
    } else {
    perror ("Failed to fork\n");
    }
}

并说要实施ls > tmp,我们需要在exec

之前加入以下行
close (1);
fd = open ("tmp1", O_CREAT|O_WRONLY);
// fd will be 1!

对于ls 2>tmp>tmp,我们需要包含

close(1);
close(2);
fd1 = open ("tmp1", O_CREAT|O_WRONLY);
fd2 = dup (fd1);

任何人都可以从简单的角度向我解释一下文件描述符以及close(1)close(2)的作用。并且要关闭的输入是fd,而2是错误,那么close(2)做什么?

1 个答案:

答案 0 :(得分:1)

您的主要问题是关闭(1)和关闭(2)。因此,我不会查看您的所有代码。

当调用程序的主要功能时,它已经有三个预定义的流打开并可供使用,它们的文件描述符如下,它们也被定义为宏。

 *STDIN_FILENO*
This macro has value 0, which is the file descriptor for standard input.

*STDOUT_FILENO*
This macro has value 1, which is the file descriptor for standard output.

*STDERR_FILENO*
This macro has value 2, which is the file descriptor for standard error output. 

因此当你的关闭函数关闭(1)时,它关闭标准输出,当你关闭(2)时,它关闭标准错误输出。

注意:通常,在进程成为守护程序进程之前,这些文件描述符不会关闭。