2015-07-25 13 views
13

Tôi tự hỏi nếu có một tương đương Windows cho Linux mkfifo. Tương đương, tôi có nghĩa là cách tạo tệp, với st_mode S_IFIFO. Cảm ơn câu trả lời.Tệp nămo Ví dụ về Windows

+0

Windows không có tệp "mọi thứ đều là tệp" trừu tượng, bạn sẽ cần phải làm bằng một đường ống có tên. Tìm lại nó bằng tên từ không gian tên đối tượng hạt nhân không phải là vấn đề. –

+0

Tôi chỉ hỏi vì Windows đã xác định _S_IFIFO, nhưng có lẽ nó chỉ được định nghĩa cho một số khả năng tương thích ngược. Ngoài ra ntfs-3g (từ Linux) nhận ra một số tập tin như S_IFIFO. –

+0

Hmm, bạn thấy rằng trong stat.h, một tiêu đề mà Microsoft đã phải cạnh tranh. Về mặt kỹ thuật có thể bằng cách gói một tay cầm ống có tên, nó vẫn không phải là một tập tin. –

Trả lời

2

Có thể mô phỏng hành vi mkfifoở một mức độ. Tôi đã thực hiện một cái gì đó như thế nhiều năm trước cho OS/2 mà là khá giống với WinXX đối với hệ thống tập tin.

Hạn chế chính là Windows sử dụng tên file dành riêng cho ống:. \\ \ ống \ pipename hoặc \\ servername \ ống \ pipename qua mạng (mà có thể rất hữu ích). Nhưng bạn sẽ không thể sử dụng các tên FIFO tùy ý trực tiếp. Tên đường ống cần tiền tố \\. \ Pipe \.

Tuy nhiên, một ứng dụng có thể tạo đường ống với CreateNamedPipe với PIPE_ACCESS_DUPLEX và ví dụ: tên GUID và tạo liên kết tượng trưng cho đường ống này trong thư mục đích với DeviceIoControl/FSCTL_SET_REPARSE_POINT. Điều này sẽ khá gần với mkfifo.

Hạn chế là ứng dụng dịch vụ đường ống phải chạy miễn là phiên bản đường ống tồn tại. Và, tất nhiên, nó sẽ làm sạch các liên kết tượng trưng về chấm dứt. Hơn nữa, nó cần phải đọc tất cả dữ liệu từ đường ống và viết lại. Không chắc chắn liệu điều này có thể được thực hiện với bản sao không.

Có một số khía cạnh khác. Ví dụ. nếu bạn muốn có thể xóa FIFO được mô phỏng của mình, bạn cần theo dõi việc xóa liên kết tượng trưng và chấm dứt quy trình công nhân trong trường hợp này.

Tôi rất tiếc, tôi không có môi trường phát triển Windows nên tôi không thể thử nghiệm phương pháp này.

+0

cảm ơn bạn đã trả lời. Tôi đã không thực sự cố gắng để tạo ra tập tin như vậy. Tôi hỏi vì trên hệ thống Linux, trình điều khiển ntfs-3g thực sự không nhận ra một số tệp trên phân vùng NTFS là FIFO \ SOCKET. Và đọc từ tập tin như vậy bất ngờ bị treo. Đó là tính năng của trình điều khiển FUSE ntfs-3g. '> fsutil tập tin createnew fifo 0 > fsutil file socket createnew 1 > attrib + S -H fifo > attrib + S -H socket' –

+0

Tôi đã cố gắng để tạo ra một liên kết tượng trưng cho một con đường bắt đầu với' \\ . \ pipe' và tôi không thể làm việc đó. Xem [this] (https://superuser.com/questions/1265561/create-a-symbolic-link-to-a-named-pipe) câu hỏi. – IllidanS4