Почему 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; но я не могу найти возможный "особый случай" с кодом, приведенным в начале. Мне интересно, есть ли в упражнении двусмысленность, или я чего-то не понял. Заранее спасибо!