Tôi có thể đặt bất kỳ hai quá trình cho nhau?


8

Trong trang này từ Thiết kế và triển khai Hệ điều hành 4.4BSD , người ta nói rằng:

Một sự khác biệt lớn giữa đường ống và ổ cắm là đường ống đòi hỏi một quy trình cha mẹ chung để thiết lập kênh liên lạc

Tuy nhiên, nếu tôi ghi lại chính xác, cách duy nhất để tạo một quy trình mới là một quy trình forkhiện có. Vì vậy, tôi thực sự không thể thấy làm thế nào 2 quá trình không thể có một tổ tiên chung. Tôi có đúng không khi nghĩ rằng bất kỳ cặp quy trình nào có thể được dẫn đến nhau?


1
Nếu câu hỏi của bạn thực sự là về "tổ tiên chung" thì đó không phải là câu nói của bạn. Cha mẹ là tổ tiên, nhưng không phải tất cả tổ tiên đều là cha mẹ.
msw

có một cái nhìn ps auxfcho một ý tưởng về quá trình tổ tiên.
michas

@msw bạn có nghĩa là 2 quá trình cần phải có cùng cha mẹ trực tiếp? Là anh em họ (tức là có ông bà chung) là chưa đủ?
qdii

Câu trả lời:


7

Tôi có đúng không khi nghĩ rằng bất kỳ cặp quy trình nào có thể được dẫn đến nhau?

Không hẳn vậy.

Các đường ống cần phải được thiết lập theo quy trình của cha mẹ trước khi trẻ hoặc trẻ bị ngã ba. Khi tiến trình con bị rẽ nhánh, các mô tả tệp của nó không thể được thao tác "từ bên ngoài" (bỏ qua những thứ như trình gỡ lỗi), cha mẹ (hoặc bất kỳ quy trình nào khác) không thể thực hiện phần "thiết lập kênh comms." .

Vì vậy, nếu bạn thực hiện hai quy trình ngẫu nhiên đang chạy, bạn không thể trực tiếp thiết lập một đường ống giữa chúng. Bạn cần sử dụng một số dạng ổ cắm (hoặc cơ chế IPC khác) để khiến chúng giao tiếp. (Nhưng lưu ý rằng một số hệ điều hành, FreeBSD trong số chúng, cho phép bạn gửi mô tả tệp trên ổ cắm tên miền Unix.)


4

Câu đó không rõ ràng lắm. Đầu tiên, cha mẹ nên là tổ tiên , vì quá trình thiết lập đường ống có thể là cha mẹ, hoặc ông bà hoặc ông bà ngoại - hoặc một trong những quá trình giao tiếp. Thứ hai, câu không có nghĩa là nếu bạn muốn có một đường ống, thì phải tồn tại một quy trình tổ tiên chung, nhưng nếu bạn muốn một đường ống, một quy trình tổ tiên chung phải thiết lập nó.

Dưới mui xe, một quá trình thiết lập một đường ống với chính nó. Các ống là một mô tả tập tin như bất kỳ khác, hoặc chính xác hơn là một cặp mô tả tập tin, một cho mỗi đầu. Quá trình tạo ra đường ống có thể sử dụng nó ngay lập tức để gửi dữ liệu đến chính nó, mặc dù điều này hiếm khi hữu ích (mặc dù một ống tự có sử dụng nó).

Một thành ngữ điển hình là một quy trình để thiết lập một đường ống, sau đó rẽ nhánh một quá trình con và đóng một đầu của ống trong cha mẹ và đầu kia của ống ở trẻ. Điều này cho phép cha mẹ và quá trình con giao tiếp theo một hướng. Nếu các quy trình cần giao tiếp hai chiều, chúng cần hai đường ống (ngoại trừ một số biến thể unix trong đó đường ống là hai chiều).

Các đường ống được thừa kế lần lượt bởi bất kỳ đứa trẻ nào, vì vậy quá trình tạo ra đường ống có thể không liên quan đến giao tiếp. Ví dụ: một đường ống trong một vỏ được tạo giữa hai lệnh bên ngoài, chẳng hạn như ls | rot13bao gồm các bước sau:

  • Vỏ tạo ra một đường ống.
  • Vỏ rèn một quá trình. Đứa trẻ đóng cửa cuối đọc của ống và các cuộc gọi execvetrên ls.
  • Vỏ rèn một quá trình. Đứa trẻ đóng viết cuối đường ống và các cuộc gọi execvetrên rot13.
  • Vỏ đóng cả hai đầu của ống và chờ cho cả hai quá trình con thoát ra.

Nếu hai quy trình hiện tại muốn liên lạc với nhau, họ có thể sử dụng một đường ống có tên . (Chà, cũng có người mô tả tập tin đi qua , nhưng nó không dành cho người yếu tim.)


2

Vỏ của đường ống là cha mẹ chung thiết lập kênh liên lạc giữa một số thành viên của đường ống.

Bất kỳ quá trình có thể được dẫn đến bất kỳ quá trình khác. Các quy trình duy nhất có thể được kết hợp một cách hữu ích là các "bộ lọc" đọc từ stdin và ghi vào thiết bị xuất chuẩn.

Ví dụ: nếu bạn ban hành lệnh

$ tail -f /etc/motd | tail -f | cat > /dev/null

ps -eaH sẽ cho thấy rằng con mèo và hai cái đuôi của nó là con của cái vỏ cầu khẩn:

 1675 pts/0    00:00:00     bash
 2483 pts/0    00:00:00       tail
 2484 pts/0    00:00:00       tail
 2485 pts/0    00:00:00       cat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.