После того, как процесс разветвится и у нас появится новый клонированный процесс, повлияет ли закрытие файла в дочерней таблице на таблицу в родительском?

Данный процесс А с файловым дескриптором. Процесс А forks() и создает клон себя. Давайте назовем это процессом B. Теперь каждый из процессов A и B имеет свой собственный дескриптор. Однако изменение значения в дочернем элементе не повлияет на значение в родительском элементе. Так, скажем, например, я звоню close(3) у потомка у ребенка изначально были те же значения, что и у родителя при его создании. Но теперь, если родитель все еще предполагает, что файл открыт (поскольку между тем, что происходит в таблицах дескрипторов родителя и дочернего элемента, существует отрыв), не вызовет ли это конфликт? Разве родитель не предположил бы, что файл открыт?

2 ответа

Решение

Когда файловые дескрипторы наследуются во время 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 являются точками одной и той же записи таблицы файлов для этого файлового дескриптора. Если оба процесса являются точками одной и той же записи таблицы файлов, то смещение файла и флаг состояния файла являются общими. Если он является общим, существует ли какой-либо один процесс, закрывающий файл, это повлияет на другой процесс.

Другие вопросы по тегам