我正在从一些笔记中学习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)
做什么?
答案 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)时,它关闭标准错误输出。
注意:通常,在进程成为守护程序进程之前,这些文件描述符不会关闭。