进程分叉后,我们有一个新的克隆进程,关闭 child 的 table 中的文件会影响 parent 中的 table 吗?
After a process forks and we have a new cloned process, will closing a file in the child's table affect the table in the parent?
给定 进程 A 和一个文件描述符。处理 A forks()
并创建其自身的克隆。我们称它为 进程 B。现在,每个进程 A 和 B 都有自己的描述符。但是,更改 child 中的值不会影响 parent 中的值。因此,举例来说,我在 child 中调用 close(3)
,child 在创建时最初与 parent 具有相同的值。但是现在如果 parent 仍然假设文件是打开的(因为 parent 和 child 的描述符表中发生的事情之间存在分离),这不会导致冲突? parent 是否仍会假定该文件已打开?
在 fork
期间继承文件描述符时,关闭父项中的描述符对子项中的相应描述符没有影响,反之亦然。
下面是 pipe
手册页中的一个示例,正是这样做的:
#include <sys/wait.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
int pfd[2];
pid_t cpid;
char buf;
assert(argc == 2);
if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); }
cpid = fork();
if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }
if (cpid == 0) { /* Child reads from pipe */
close(pfd[1]); /* Close unused write end */
while (read(pfd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(pfd[0]);
_exit(EXIT_SUCCESS);
} else { /* Parent writes argv[1] to pipe */
close(pfd[0]); /* Close unused read end */
write(pfd[1], argv[1], strlen(argv[1]));
close(pfd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
}
是的。会影响。因为,进程 A 和进程 B 都指向该文件描述符的同一文件 table 条目。如果两个进程都指向同一个文件 table 条目,那么文件偏移量和文件状态标志是共享的。
如果是共享有任何一个进程关闭文件,它会影响另一个进程。
给定 进程 A 和一个文件描述符。处理 A forks()
并创建其自身的克隆。我们称它为 进程 B。现在,每个进程 A 和 B 都有自己的描述符。但是,更改 child 中的值不会影响 parent 中的值。因此,举例来说,我在 child 中调用 close(3)
,child 在创建时最初与 parent 具有相同的值。但是现在如果 parent 仍然假设文件是打开的(因为 parent 和 child 的描述符表中发生的事情之间存在分离),这不会导致冲突? parent 是否仍会假定该文件已打开?
在 fork
期间继承文件描述符时,关闭父项中的描述符对子项中的相应描述符没有影响,反之亦然。
下面是 pipe
手册页中的一个示例,正是这样做的:
#include <sys/wait.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
int pfd[2];
pid_t cpid;
char buf;
assert(argc == 2);
if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); }
cpid = fork();
if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }
if (cpid == 0) { /* Child reads from pipe */
close(pfd[1]); /* Close unused write end */
while (read(pfd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(pfd[0]);
_exit(EXIT_SUCCESS);
} else { /* Parent writes argv[1] to pipe */
close(pfd[0]); /* Close unused read end */
write(pfd[1], argv[1], strlen(argv[1]));
close(pfd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
}
是的。会影响。因为,进程 A 和进程 B 都指向该文件描述符的同一文件 table 条目。如果两个进程都指向同一个文件 table 条目,那么文件偏移量和文件状态标志是共享的。 如果是共享有任何一个进程关闭文件,它会影响另一个进程。