尽管我已经相当习惯于UNIX,并且已经在它上面编程很长时间了,但我不习惯文件操作。
我知道0/1/2文件描述符是标准的输入、输出和错误。我知道,每当一个进程打开一个文件时,都会给它一个描述符,该描述符的值最小,但尚未使用-我了解一些关于使用dup/dup2的事情。
不过,我对进程之间的文件描述符感到困惑。是否每个进程都有自己的0/1/2描述符用于in/out/error,还是这3个描述符在所有进程之间共享?为什么你可以在3个不同的shell中运行3个程序,而如果它们是共享的,那么它们都只得到自己的程序输出?
如果两个程序在启动后打开myfile.txt,它们是否都使用文件描述符#3,或者第二个程序将使用#4,因为3已被占用?
我知道我在那里用了几种方式问了同样的问题,但我只是想弄清楚。细节越多越好:)我在编程时从来没有遇到过这些东西的问题,但我正在阅读一本UNIX书籍来理解更多,我突然意识到这让我困惑了很多,而且我以前从来没有详细考虑过它。
发布于 2011-08-19 08:58:07
每个文件描述符对于进程都是本地的。但是,一些文件描述符可以引用同一文件-例如,如果您使用fork()创建子进程,它将共享父进程打开的文件。它将有自己的一组文件描述符,最初与父级的文件描述符相同,但它们可以随着关闭/dup-ing等而改变。
如果两个程序打开同一个文件,通常它们会得到不同的文件描述符,指向不同的内部结构。但是,使用某些技术(fork、FD传递等)您可以让不同进程中的文件描述符指向相同的内部实体。然而,通常情况并非如此。
回答你的问题,对于新打开的文件,两个程序都会有FD #3。
发布于 2011-08-19 09:01:39
Unix中的文件描述符(通常)通过fork()和exec()调用保持不变。所以,是的,多个进程可以共享文件描述符。
例如,shell可能会执行如下命令:
foo | bar在这种情况下,foo的stdout必须连接到bar的stdin。为此,shell很可能使用管道()来创建读取器和写入器文件描述符。它分叉()了两次。描述符会持续存在。调用foo的fork()将关闭( 1 );dup( writer_fd );生成writer_fd描述符1。然后它将exec(),进程foo将输出到我们创建的管道。对于bar,我们关闭(0);dup(读取器);然后是exec()。瞧,foo将输出到bar。
发布于 2011-08-19 09:15:40
不要将文件描述符与它们所代表的资源混淆。您可以有十个不同的进程,每个进程都有一个文件描述符'3‘open,并且每个进程都引用一个不同的打开文件。当进程使用其文件描述符来执行I/O时,OS知道哪个进程正在执行I/O,并且能够消除引用哪个文件的歧义。
https://stackoverflow.com/questions/7115735
复制相似问题