Jeśli użyjemy, echo 1234 >> some-file
wówczas Dokumentacja mówi, że wynik jest dołączany.
Domyślam się, że jeśli jakiś plik nie istnieje, O_CREAT utworzy nowy plik. Jeśli >
został użyty, O_TRUNC obetnie istniejący plik.
W przypadku >>
: Czy plik zostanie otwarty jako O_WRONLY (lub O_RDWR) i nastąpi próba zakończenia, a operacja zapisu zostanie wykonana, symulując O_APPEND? A może plik zostanie otwarty jako O_APPEND, pozostawiając go jądrze, aby upewnić się, że nastąpi dołączenie?
Pytam o to, ponieważ proces konserwatora zastępuje niektóre znaczniki wstawione przez echo, gdy plik wyjściowy pochodzi z punktu montowania NFS, a Dokumentacja NFS mówi, że O_APPEND nie jest obsługiwany na serwerze, więc jądro klienta będzie musiało to obsłużyć. Wydaje mi się, że proces konserwatora używa O_APPEND, ale nie jestem pewien bash >>
na Linuksie, stąd zadaje pytanie tutaj.
O_APPEND
nie jest obsługiwany; problem polega na tym, że jest emulowany. W lokalnym systemie plików kilka procesów zapisujących do tego samego otwartego plikuO_APPEND
nigdy nie nadpisuje danych; na NFS,O_APPEND
jest emulowany przez dążenie do końca przed napisaniem, co pozostawia możliwość warunków wyścigowych. W NFS nie można tego obejść; każdy piszący równolegle musi napisać własny plik. Jedynym sposobem obejścia tego problemu jest skonfigurowanie procesu serwera na serwerze NFS, zalogowanie rejestratorów|nc server port
i włączenie przez serwer danych przychodzących do dziennika.