2013-02-01 21 views
9

Tôi đang sử dụng một đường ống có tên để nắm bắt đầu ra của một chương trình bên ngoài (wgrib2) trong một chương trình khác (Matlab). Mã Matlab dưới đây và system truy cập vào dòng lệnh để tạo đường ống. Dưới đây là câu hỏi của tôi:Nên đặt tên các đường ống được mở bằng mkfifo và cách nào?

  1. Tôi có phải đóng ống có tên myfifo sau khi tôi sử dụng không? Dường như nó tồn tại sau khi mã được chạy.
  2. Nếu cần đóng myfifo, lệnh đóng là gì?
  3. Tôi sẽ chạy mẫu mã dưới đây nhiều lần (> 1000), vì vậy có OK không nếu tôi sử dụng lại ống có tên và không đóng nó cho đến khi kết thúc?
system('mkfifo myfifo');  % Make a named pipe myfifo 
% Call the external program wgrib2 and dump its output to the named pipe myfifo 
system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166 > myfifo &'); 
fid = fopen('myfifo', 'r'); % Open the named pipe 
a = fscanf(fid, '%c');  % Read the output as character 
fclose(fid);     % Close the "file" (myfifo still exists afterward) 

Trả lời

1

Có thể bạn không nên sử dụng ống được đặt tên để ghi lại kết quả đầu ra của hệ thống trong MATLAB. Mỗi MATLAB's system() documentation, bạn có thể nắm bắt đầu ra trực tiếp trong system() gọi:

[status, cmdout] = system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166'); 
a = cmdout 

Tuy nhiên, nếu bạn nhấn mạnh vào cách sử dụng một ống tên, rồi nhấn Yes, bạn nên đóng nó lại. Bạn nên luôn luôn đóng tài nguyên bạn mở. Nhưng đóng một đường ống có tên là thìkhông xóa nó.

9
  1. số Unix đối xử với tất cả mọi thứ như một tập tin. Ống có tên không khác nhau. Nếu bạn đã sử dụng xong, có thể bạn muốn đóng nó để bạn không làm lộn xộn máy bằng các đường ống có tên, nhưng bạn không cần phải đóng nó.

Được chỉnh sửa để phản ánh bên dưới nhận xét, đó là chính xác. Đang xóa! = Đóng.

  1. Bạn đóng đường ống đặt tên giống như cách bạn đóng bất kỳ file:
fclose(mFifo) 

Như đã đề cập trong câu trả lời được chấp nhận, bế mạc sẽ không xóa các fifo. Bạn có thể cần phải làm điều đó một cách riêng biệt.

  1. Không có gì sai khi sử dụng lại ống được đặt tên. Tuy nhiên, tùy thuộc vào bạn, để biết khi nào bạn đọc xong/ghi vào nó cho mỗi lần lặp lại. Khi tất cả dữ liệu đã được đọc ra khỏi đường ống, bạn có thể sử dụng lại dữ liệu đó bao nhiêu lần tùy thích.
+1

Câu trả lời này là sai. 1: Chương trình thực sự cần * cần * để đóng ống. Ngay cả các máy trạm có thể chạy ra khỏi các tập tin mở nếu chương trình xấu không đóng các tập tin của họ. 2: Bạn ** không ** đóng một đường ống có tên bằng cách xóa nó. Đóng và xóa là các hoạt động khác nhau. – willkil

+1

Bạn đã chính xác. Tôi đã cập nhật câu trả lời cho hậu thế. –

0

Không thể đồng ý. Bạn đóng nămo bằng cách đóng nó lại. Hệ thống đóng cửa nămo khi nó kết thúc (hệ thống() gọi ở trên). Khi FIFO được đóng, phía bên kia biết rằng không có nhiều dữ liệu hơn (điều kiện EOF, không có kiểm tra EOF rõ ràng trong mã ví dụ nhưng nó rất có thể xảy ra trong thực tế) và kết thúc.

+0

'Không thể đồng ý' với nội dung gì? – EJP

+0

Bạn có thể hiển thị lệnh để sử dụng cho # 2 không? – KAE

+0

Tôi thực sự đã đến trang này vì không biết nhiều về năm mươi. Nhưng op hy vọng xóa năm mươi sau khi đóng nó, trong khi hệ thống hoạt động theo cách khác. Cũng giống như với bất kỳ tập tin nào khác có thể mở và đóng nămo hoặc quyết định xóa nó. Dưới đây là ví dụ: – Arseny

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