gpt4 book ai didi

C用fork()编写后关闭FDT?

转载 作者:行者123 更新时间:2023-12-04 18:59:22 27 4
gpt4 key购买 nike

我正在与某人讨论以下代码:

#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 ing。假设这个代码片段中的所有函数调用都成功了(你真的应该测试一下,尤其是因为它会解决你的争议)......

    fd = open("myfile", O_RDWR); // line 7
close(0);
close(1);
dup(fd);
dup(fd);

...您之后拥有三个不同的文件句柄,它们都引用相同的打开文件描述。关闭其中一个会解除文件描述符与底层打开文件描述的关联,但这不会使其他文件描述符无效,并且当任何文件描述符与之关联时,底层打开文件描述不会关闭。
当该进程成功派生时,新的子进程将获取其自己的独立文件描述符,具有相同的数值,所有这些都与与父进程相同的打开文件描述相关联。即当你在第二个 dup 之后成功 fork ,然后有六个打开文件描述符,它们都与相同的底层打开文件描述相关联——三个在父级中,三个在子级中。文件描述符编号在父项和子项中相同的事实是无关紧要的。文件描述符编号是每个进程的属性。
子则 dup() s 文件描述符 fd再次,制作(成功时)与打开文件描述相关联的第七个文件描述符。然后 child 从 if 的底部掉了下来。阻止并关闭其文件描述符 fd .它正常终止,结果所有其他打开的文件描述符也被关闭。
这些都不会直接影响父级,除了父级将从其 wait() 唤醒。并继续。然后它将关闭自己打开的文件描述符,一个显式地关闭,其余的在它自己终止时隐式地关闭。
同一个文件描述符没有多次关闭,但同样,如果您对此感到担忧,那么您可以检查 close() 的返回值判断是否成功完成。

关于C用fork()编写后关闭FDT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67266959/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com