2012-10-23 23 views
6

Hàm mkfifo nhận 2 đối số, đường dẫn và chế độ. Nhưng tôi không biết định dạng của đường dẫn mà nó sử dụng là gì. Tôi đang viết một chương trình nhỏ để tạo một đường ống có tên và là đường dẫn trong mkfifo. Sử dụng ví dụ /home/username/Documents, nhưng nó luôn trả về -1 với thông báo Error creating the named pipe.: File exists.mkfifo() error ---> "Lỗi khi tạo đường ống có tên: Tệp tồn tại"

Tôi đã kiểm tra thư mục này rất nhiều lần và không có đường ống bên trong. Vì vậy, tôi tự hỏi vấn đề là gì. Chế độ tôi sử dụng trong mkfifo là 0666 hoặc 0777.

+0

bạn có thể thêm cuộc gọi chức năng chính xác không? – tomahh

+0

Errr, bạn đã quên đặt tên cho đường ống? Đường dẫn là thư mục + '/' + tên tệp, vì vậy '/ home/username/Documents/mypipe'. –

+0

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

Trả lời

5

Bạn đã nhập mkfifo() tên của thư mục hiện có, do đó là lỗi. Bạn phải cung cấp cho nó tên của một tập tin không tồn tại:

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

Cảm ơn bạn! Chỉ cần hiểu điều đó. :) – SpyrosR

2

Các 'path' lập luận để mkfifo() có để xác định một đường dẫn đầy đủ, thư mục và tên tập tin đó là.

Do đó, nó sẽ là:

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

mkfifo(myfifo, 0777); 

Là một mặt lưu ý, bạn nên tránh sử dụng các bit cho phép bát phân và sử dụng tên hằng số thay vì (từ sys/stat.h), do đó:

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

Điều gì sai với quyền bát phân? Chúng cực kỳ tiêu chuẩn và phổ quát. – wallyk

+0

Cảm ơn Michal !;) – SpyrosR

+1

Và quyền bát phân là một đống toàn bộ gọn gàng hơn, quá! Tuy nhiên, về lý thuyết, bạn phải sử dụng tên S_Iwxyz. Trong thực tế, bạn sẽ tốt ở hầu hết mọi nơi bằng cách sử dụng bát phân. –

0

Sử dụng remove() để xóa tệp ở cuối chương trình hoặc khi bắt đầu chương trình, để đảm bảo tệp không tồn tại khi tạo tiếp theo.

Các vấn đề liên quan