2009-06-26 10 views

Odpowiedz

4

Nie, biblioteka standardowa nie ma takiej funkcjonalności.

1

Być może po prostu spróbować i uzyskać pełną blokadę zapisu? Nie powiedzie się, jeśli ktokolwiek inny będzie otwarty na czytanie lub pisanie.

fopen("myfile.txt", "r+") 

Jeśli nie jest wieloplatformowym i Win32, to można żądać nawet bardziej drobnoziarnista zestaw zamków.

Zobacz here i spójrz na dwShareMode, wartość 0, a także inne parametry.

+0

Zależy całkowicie od systemu operacyjnego. –

0

Jak mówi @Neil Butterworth, standardowa biblioteka nie robi.

W systemie Unix można użyć fcntl, aby korzystać z blokad plików.

Można napisać opakowanie dla funkcji otwartej, która sprawdza blokadę (i blokuje, jeśli nie istnieje) plik, jeśli nie jest otwarty przez nikogo innego. Możesz również napisać wrapper dla close, który zwalnia tę blokadę z pliku.

+0

Zablokowanie jest czysto doradcze, więc to tylko mówi, czy ktoś inny zgromadził plik. – ephemient

0

W Windows Ten mały i brudnysztuczka zadziała (jeśli plik istnieje i masz odpowiednie uprawnienia)

if ( 0 != rename("c:/foo.txt", "c:/foo.txt") ) { 
    printf("already opened\n"); 
    } 

To może działać również w systemie Linux.

+0

To jest naprawdę brudne :-) – Totonga

+0

:) –

+0

Mogłem łatwo wyobrazić sobie kogoś dodającego "poprawkę" do os w przyszłości, która złamała tę sztuczkę. – Brian

3

Nie tylko biblioteka standardowa nie ma tej funkcji, w ogóle nie jest to możliwe. Możesz (na Linuksie) sprawdzić /proc/*/fd , ale możliwe jest, że twój program nie ma uprawnień, aby zrobić to na procesach od innych użytkowników (jest to na przykład domyślne w Ubuntu).

2

Jeśli kontrolujesz drugi proces (ma kod źródłowy), najlepszym planem jest użycie blokad doradczych w obu procesach. To blokowanie jest zdefiniowane w POSIX i będzie przenośne w różnych systemach operacyjnych.

W systemie Linux można użyć narzędzia lsof, aby zobaczyć, jakie pliki są otwierane przez inne procesy.

Jest to ograniczone do tego, na co masz uprawnienia - musisz zrobić czek jako uprzywilejowany użytkownik, lub uzyskasz wyniki tylko dla plików otwartych przez tego samego użytkownika, co ten, który sprawdza.

Wiem tylko o narzędziu wiersza poleceń, a nie o wywołaniu systemowym, którego można użyć bezpośrednio z kodu C.

W systemie Linux można również włączyć mandatory locking dla danego systemu plików (mount -o mand) i ustawić specjalne flagi w pliku (chmod g-x, g + s). Następnie, gdy proces próbuje uzyskać blokadę zapisu, nie powiedzie się, jeśli inny proces ma otwarty plik. To prawie nigdy nie jest używane, ale jeśli całkowicie kontrolujesz dany system, może to być opcja.

+1

Próbowałem spojrzeć na kod źródłowy lsof jeden raz, aby zobaczyć, jak to zrobili i moja głowa prawie eksplodowała. Źródłem lsof jest sieć szaleństwa i czarnej magii. –

+2

Proponuję użyć utrwalacza nad lsof. Parsowanie wyników będzie znacznie prostsze. – AFoglia

2

Poniższy kod może działać.

int main(int argc, char ** argv) 
{ 
    int fd = open(argv[1], O_RDONLY); 
    if (fd < 0) { 
     perror("open"); 
     return 1; 
    } 

    if (fcntl(fd, F_SETLEASE, F_WRLCK) && EAGAIN == errno) { 
     puts("file has been opened"); 
    } 
    else { 
     fcntl(fd, F_SETLEASE, F_UNLCK); 
     puts("file has not been opened"); 
    } 

    close(fd); 
    return 0; 
} 
Powiązane problemy