2012-10-23 21 views
6

Funkcja mkfifo przyjmuje 2 argumenty, ścieżkę i tryb. Ale nie wiem, jaki jest format ścieżki, której używa. Piszę mały program, aby utworzyć nazwany potok i ścieżkę w mkfifo. Na przykład, używając /home/username/Documents, ale zawsze zwraca -1 z komunikatem Error creating the named pipe.: File exists.mkfifo() error ---> "Błąd podczas tworzenia nazwanego potoku .: Plik istnieje"

Sprawdziłem ten katalog wiele razy i nie ma w nim żadnej fajki. Więc zastanawiam się, jaki jest problem. Tryb używany w mkfifo to 0666 lub 0777.

+0

Czy możesz dodać dokładne wywołanie funkcji? – tomahh

+0

Błędem, czy zapomniałeś podać nazwanej fajki? Ścieżka to katalog + '/' + nazwa pliku, więc '/ home/nazwa_użytkownika/Dokumenty/mypipe'. –

+0

char * myfifo = "/ home/username/Documents"; mkfifo (myfifo, 0777); – SpyrosR

Odpowiedz

5

Dałeś mkfifo() nazwę istniejącego katalogu, a tym samym błąd. należy nadać mu nazwę nieistniejącego pliku:

mkfifo("/home/username/Documents/myfifo", 0600); 
+0

Dziękuję! Po prostu to zrozumiałem. :) – SpyrosR

2

„path” argument mkfifo() musi podać pełną ścieżkę, katalog i nazwę pliku, który jest.

Zatem byłoby:

char *myfifo="/home/username/Documents/mypipe"; 

mkfifo(myfifo, 0777); 

Na marginesie, należy unikać ósemkowe bity uprawnień i używać nazwie stałe zamiast (od sys/stat.h), więc:

mkfifo(myfifo, S_IRWXU | S_IRWXG | S_IRWXO); 
+0

Co jest nie tak z uprawnieniami ósemkowymi? Są niezwykle standardowe i uniwersalne. – wallyk

+0

Dzięki Michał !;) – SpyrosR

+1

I ósemkowe uprawnienia są również bardziej zwięzłe! Jednak teoretycznie powinieneś używać nazw S_Iwxyz. W praktyce prawie wszystko będzie dobrze, używając zamiast tego ósemkowego. –

0

Korzystając remove() aby usunąć plik na końcu programu lub na początku programu, aby upewnić się, że nie istnieje podczas następnego tworzenia.

Powiązane problemy