Dla jasności zapewnienie, że plik zostanie utworzony, tylko jeśli nie istnieje, to nie to samo co atomowość. Operacja jest atomowa wtedy i tylko wtedy, gdy dwa lub więcej oddzielnych wątków próbuje zrobić to samo w tym samym czasie, dokładnie jeden odniesie sukces, a wszystkie inne zawiedzie.
Najlepszym sposobem, wiem, aby utworzyć plik atomowo w skrypcie powłoki następuje tego wzorca (i to nie jest idealne):
- utworzyć plik, który ma bardzo dużą szansę na nieistniejące (przy użyciu przyzwoity wybór losowy numer lub coś w nazwie pliku), a następnie umieść jakieś unikalne treści w nim (coś, że żaden inny wątek nie miałby - znowu, liczba losowa lub coś)
- sprawdzić, czy plik istnieje i zawiera treść można oczekiwać to do
- utwórz twardy link z tego pliku do żądanego pliku
- zweryfikować, że żądany plik zawiera oczekiwanych zawartość
W szczególności touch
nie jest atomowa, ponieważ będzie utworzyć plik, jeśli go tam nie ma, lub po prostu zaktualizować znacznik czasu. Możesz grać w gry z różnymi znacznikami czasu, ale czytanie i analizowanie znacznika czasu, aby sprawdzić, czy "wygrałeś" wyścig jest trudniejsze niż powyższe. mkdir
może być atomowej, ale trzeba by sprawdzić kod zwrotny, bo w przeciwnym razie, można tylko powiedzieć, że „tak, katalog został stworzony, ale nie wiem, który wygrał gwint”. Jeśli jesteś na systemie plików, który nie obsługuje dowiązania twarde, może trzeba zadowolić się mniej idealnym rozwiązaniem.
_The system gwarantuje, że plik zostanie utworzony tylko jeśli nie exist_ Hmpf. Jeśli plik nie istnieje, zostanie utworzony. Jeśli istnieje, wywołanie systemowe zakończy się niepowodzeniem. – pbhd
Możesz wypróbować 'mktemp', aby utworzyć plik, a następnie spróbuj' mv' go do żądanej nazwy. –