2012-03-30 25 views
6

Tôi có một kịch bản nơi tôi đã tạo đường ống để liên lạc giữa hai con và cha mẹ. Phụ huynh viết (sử dụng chức năng ghi) dữ liệu vào đường ống và đóng bộ mô tả tệp tương ứng. Vấn đề là khi tôi muốn ghi dữ liệu một lần nữa vào đường ống, hàm viết trả về mã lỗi -1. Tôi nghĩ rằng nó vì kết thúc viết đã bị đóng trong lần lặp trước. Sau đó, làm thế nào để mở mô tả tập tin tương ứng sau khi nó đã được đóng lại một lần.Cách mở lại một bộ mô tả tệp đã đóng

Tôi đã thử sử dụng hàm open() yêu cầu đường dẫn đến một số tệp như tranh luận. Nhưng tôi không sử dụng bất kỳ tệp nào trong ứng dụng của mình. Tôi có các bộ mô tả tập tin đơn giản (int arr [2]).

Có thể đạt được kịch bản trên với ống ????

Trả lời

10

Khi ống đã đóng, nó đóng lại. Bạn không thể mang nó trở lại.

Nếu bạn muốn viết nhiều hơn cho nó, đừng đóng nó ngay từ đầu - nó đơn giản như vậy.

+3

nếu chúng tôi không đóng bộ mô tả tập tin, nó sẽ không gửi EOF vào dòng tương ứng. Vì vậy, trong quá trình con nó sẽ chờ liên tục cho đầu vào. Nhưng, tôi muốn viết số lần giới hạn vào luồng và đọc đồng thời ở đầu kia của đường ống – chaitu

+0

@chaitu: Đúng là nếu bạn không đóng đầu ghi, đầu đọc sẽ không hiển thị phần cuối của tệp . Điều này có nghĩa là bạn cần sử dụng thứ gì đó khác với phần cuối của tệp để biểu thị phần cuối của thư, nếu bạn muốn gửi nhiều thư hơn cho con (thông thường, bạn sẽ sử dụng thông điệp có độ dài cố định để trẻ biết được bao lâu nó là). – caf

1

Điều cần biết về bất kỳ điều gì liên quan đến tệp (đường ống cũng là một số loại tệp) dưới dạng unix: tên tệp chỉ được sử dụng khi mở tệp. Sau đó cho đến khi tập tin được mở, nó có sẵn mãi mãi cho đến khi đóng cửa và tên không bao giờ được sử dụng một lần nữa. Khi ai đó xóa tệp trong một cửa sổ khác trong khi cửa sổ đang mở, chỉ cần tên đã biến mất, không phải tệp. Điều này có nghĩa:

  1. tập tin vẫn còn nằm trên đĩa
  2. Nó không có tên
  3. Nó vẫn còn mở
  4. Khi nó được đóng lại, kernel loại bỏ nó mãi mãi

Biết được điều này có lẽ giúp để hiểu, tại sao điều này sẽ gần như không thể "mở lại" tập tin, đường ống hoặc bất cứ điều gì tương tự một lần nữa. Tên tệp và bộ mô tả có thời gian hoạt động khác nhau.

Ngoại lệ duy nhất là stdout và stderr có mô tả luôn được biết đến như 1 và 2.

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