Почему dup2 должен быть атомарным? Что может произойти между close(oldFd) dup(newFd)?

В моем тесте операционных систем есть вопрос, в котором я не уверен:

учитывая следующий код:

int fd = open("File", O_RDWR);
dup2(fd, 1);
write(1, "Hi", 2);
exit(0); 

(1) Как вы можете заменить вызов dup2() другими системными вызовами?

Мой ответ:

 close(1);
 dup(fd);

(2) Подставляя код ответа (1) в данный код, что может произойти во время выполнения сгенерированного исполняемого файла, что подчеркивает необходимость того, чтобы dup2() была атомарной операцией?

В этом случае с "данным" кодом я не могу найти контрпример; Мой контрпример:

int fd = open("File", O_RDWR);
if(fork() == 0){
  write(1, "a", 1);
}
close(1);
dup(fd);
write(1, "Hi", 2);
exit(0);

и я говорю, что в этом примере, если строка "write(1, "a", 1)" запланирована между "close" и "dup", возникнет ошибка, поскольку не будет никакого файла с fd = 1; но я не могу найти возможный "особый случай" с кодом, приведенным в начале. Мне интересно, есть ли в упражнении двусмысленность, или я чего-то не понял. Заранее спасибо!

0 ответов

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