2009-02-27 10 views
10

Piszę program, który zapisuje dane wyjściowe do pliku. Jeśli ten plik nie istnieje, chcę go utworzyć.Korzystanie z wywołania systemowego open()

Obecnie używam następujących flag podczas wywoływania open: O_WRONLY | O_CREATE

Jednak, gdy ten tworzy plik, to nie daje mi żadnych uprawnień, aby napisać do niego ...

Jak mogę używać otwarte tak, że tworzy plik, jeśli nie istnieje, ale utworzy go z niezbędnymi uprawnieniami w razie potrzeby?

Dzięki!

Odpowiedz

17

Prawdopodobnie potrzebujesz trzeciego argumentu. Na przykład:

 
open('path',O_WRONLY|O_CREAT,0640); 
+0

To było dokładnie to! Dziękuję Ci! – samoz

+1

Mam niewielką preferencję dla używania przez David'a stałych flag (S_IRUSR | S_IWUSER | S_IRGRP | S_IROTH) zamiast trwałych zakodowanych permów, ale poza tym jest to dobra odpowiedź. –

+0

Tak, jego odpowiedź jest lepsza. Mój jest jedynie szybkim wskaźnikiem trzeciego argumentu (mój ciąg nie jest nawet ważny!). –

1

W systemie Linux istnieje trzeci argument, za pomocą którego można przekazywać uprawnienia. S_IWUSR powinien być flagą, która daje ci uprawnienia do zapisu, ale w praktyce prawdopodobnie będziesz chciał użyć większej liczby flag niż tylko ta (bitowa lub razem). Sprawdź stronę podręcznika pod kątem listy flag uprawnień.

1

Z manual:

O_CREAT

Jeśli plik istnieje, ta flaga nie ma żadnego wpływu poza opisanymi poniżej O_EXCL poniżej. W przeciwnym razie plik zostanie utworzony w postaci ; identyfikator użytkownika pliku musi być ustawiony na skuteczny identyfikator użytkownika procesu ; identyfikator grupy pliku zostanie ustawiony na identyfikator grupy katalogu nadrzędnego pliku lub na efektywny identyfikator grupy procesu ; i bity uprawnień dostępu (patrz ) trybu Dokumentacja być ustawiony na wartość trzeciego argumentu traktowanych jako typ mode_t zmodyfikowany w następujący sposób: a bitowego AND jest wykonywana na bitach plików trybu i odpowiadające bity w dopełniaczu maski procesu "tworzenie trybu pliku ". W związku z tym wszystkie bity w trybie pliku , dla których ustawiony jest odpowiedni bit w masce tworzenia trybu pliku , są kasowane. Po ustawieniu bitów innych niż bity pliku , efekt jest nieokreślony jako . Trzeci argument nie wpływa na to, czy plik jest otwarty: do odczytu, zapisu lub do obu. Wdrożenia powinny umożliwić zainicjować identyfikator grupy pliku na identyfikator grupy katalogu nadrzędnego. Implementacje mogą, ale nie muszą, udostępniać zdefiniowany w implementacji sposób , aby zainicjować identyfikator grupy pliku na efektywnego identyfikatora grupy wywołującego procesu .

Wygląda na to, że musisz podać trzeci argument określający wymagane uprawnienia do pliku.

12

Wystarczy użyć opcjonalnego trzeci argument open:

int open(const char* pathname, int flags, mode_t mode); 

więc tak:

open("blahblah", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSER | S_IRGRP | S_IROTH); 

Zobacz man open(2).

+4

To byłby "człowiek 2 otwarty". – mgold

+1

To nie jest 'S_IWUSER' ..to' S_IWUSR' –

0

Pamiętaj, że pod POSIX (Unix, Linux, MacOS itp.) Możesz otworzyć i utworzyć plik z dowolnymi wybranymi uprawnieniami, w tym 0 (bez pozwolenia dla nikogo), a mimo to nadal zapisywać do pliku, jeśli jest otwarty do pisania .

Powiązane problemy