[英]C Closing FDT after writing with fork()?
我正在与某人讨论以下代码:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/file.h>
#include <string.h>
int main() {
// creates a new file having full read/write permissions
int fd = open("myfile", O_RDWR | O_CREAT, 0666);
write(fd, "haha\n", 5);
close(fd); // line 6
fd = open("myfile", O_RDWR); // line 7
close(0);
close(1);
dup(fd);
dup(fd);
if (fork() == 0) {
char s[100];
dup(fd);
scanf("%s", s);
printf("hello\n");
write(2, s, strlen(s)); // line 18
}
wait(NULL);
printf("Father finished\n");
close(fd);
return 0;
}
他声称我们两次关闭同一个文件会导致错误,但我没有看到。
子进程有自己指向 FDT 的指针,当他关闭其中一个时,他可以毫无问题地关闭其他进程(即使其他进程可能指向同一个 FDT)
另外,这也不会影响父亲。 我错了吗? 你觉得这有什么问题吗?
首先,连续或同时打开同一个文件两次都不是错误。 关闭任何打开的文件描述符也不是错误,无论它引用什么文件。
但我认为你的争论实际上是关于所有dup
和fork
的影响。 假设这个代码片段中的所有 function 调用都成功了(你真的应该测试一下,尤其是因为它会解决你的争议)......
fd = open("myfile", O_RDWR); // line 7 close(0); close(1); dup(fd); dup(fd);
...您之后拥有三个不同的文件句柄,它们都引用相同的打开文件描述。 关闭其中一个会解除文件描述符与底层打开文件描述的关联,但这不会使其他文件描述符无效,并且当任何文件描述符与之关联时,底层打开文件描述不会关闭。
当该进程成功派生时,新的子进程将获取其自己的独立文件描述符,具有相同的数值,所有这些都与与父进程相同的打开文件描述相关联。 也就是说,当您在第二次dup
之后成功分叉时,就会有六个打开的文件描述符,它们都与相同的底层打开文件描述相关联——三个在父级中,三个在子级中。 文件描述符编号在父项和子项中相同的事实是无关紧要的。 文件描述符编号是每个进程的属性。
然后子进程再次dup()
的文件描述符fd
,生成(成功时)与打开文件描述相关联的第七个文件描述符。 然后子进程掉出if
块的底部并关闭其文件描述符fd
。 它正常终止,结果所有其他打开的文件描述符也被关闭。
这些都不会直接影响父级,除了父级将从它的wait()
中唤醒并继续。 然后它将关闭自己打开的文件描述符,一个显式地关闭,而 rest 在它自己终止时隐式地关闭。
同一个文件描述符没有多次关闭,但同样,如果您担心这一点,那么您可以检查close()
的返回值以确定它是否成功完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.