Thay đổi quá trình cha mẹ của một quá trình?


14

Có thể thay đổi quy trình cha mẹ của một quy trình? Nếu có, làm thế nào?

Ví dụ,

  • Làm thế nào để screenquản lý để đính kèm một screenphiên và các quy trình chạy bên trong nó với các quy trình shell khác nhau? Có sự thay đổi của quá trình cha mẹ?

  • Tôi dường như đã nghe nói về những cách khác để thay đổi quy trình shell trong đó một chương trình đang chạy, nhưng tôi không nhớ. Có phải cũng có sự thay đổi của quá trình phụ huynh của chương trình?

  • Tôi nghĩ disownvề một quy trình thay đổi quy trình cha mẹ của quy trình, đơn giản vì tên này disownngụ ý điều đó. Nhưng tôi thấy nó không đúng

  • Máy khách Emacs có thể đính kèm với máy chủ emacs trên một tab thiết bị đầu cuối khác. Có sự thay đổi của quá trình cha mẹ?


disownchỉ cần loại bỏ một đứa trẻ nhất định khỏi danh sách các tiến trình con của shell. PPID của trẻ vẫn là vỏ. Shell đã quên rằng nó đã từng bắt đầu đứa trẻ đó, nhưng kernel nhớ lại.
Warren Young

Liệu quá trình nhớ cha mẹ của nó?
Tim

Nếu nó muốn biết, nó gọi getppid(2), một cuộc gọi hệ thống và các cuộc gọi hệ thống được xử lý bởi kernel. Một chương trình có thể bị nhầm lẫn bằng cách phát hành cuộc gọi đó, lưu giá trị và sau đó sử dụng giá trị đó sau khi nguồn gốc của nó đã thay đổi. Có một cơ hội của một điều kiện cuộc đua ở đây.
Warren Young

Âm thanh như một tính năng hạt nhân mới thú vị.
ChuckCottrill

Câu trả lời:


14

Id tiến trình cha (ppid) của một tiến trình không thể thay đổi bên ngoài kernel; không có cuộc gọi hệ thống setppid. Hạt nhân sẽ chỉ thay đổi ppid thành (pid) 1 sau khi quá trình cha mẹ kết thúc - nếu quá trình không đáp ứng với tín hiệu rằng cha mẹ đã bị chấm dứt. Đối với điều này xảy ra, nhu cầu quá trình đã phớt lờ các tín hiệu khác nhau ( SIGHUP, SIGTERM, vv) trước đó.

screen(1)có một phương tiện rất thanh lịch để xử lý tách ra và gắn lại. Khi bạn lần đầu tiên bắt đầu screen, bạn thực sự bắt đầu một giao diện người dùng (ui), theo mặc định sẽ tạo ra một trình nền (trình quản lý phiên). Trình nền này không có thiết bị đầu cuối liên kết với nó, một nhóm quy trình mới ( setpgrp(2)), id phiên mới ( setsid(2)). Trình nền, chạy dưới dạng SCREEN, sau đó sẽ tạo các quy trình con được kết nối với thiết bị đầu cuối giả ( pty), sau đó ghép dữ liệu từ ptys và ui ( screen). Các quy trình con nghĩ rằng họ đang nói chuyện với một thiết bị đầu cuối thực sự.

Nếu ui screenchấm dứt, daemon SCREENvẫn sẽ chạy, đệm dữ liệu, xử lý tín hiệu, chờ đợi một ui mới, v.v. bởi vì nó là một nhóm quy trình khác nhau và trong phiên riêng của nó. Khi bạn gắn lại với một ui mới screen, thì daemon sẽ tiếp tục ghép kênh như trước đây. Trình nền sẽ chạy tiếp tục chạy cho đến khi tất cả các quy trình con kết thúc, bị giết, gặp phải lỗi nghiêm trọng hoặc máy chủ khởi động lại.


Cảm ơn. Tôi đã thêm "Máy khách Emacs có thể đính kèm vào máy chủ emacs trên tab thiết bị đầu cuối khác. Có thay đổi quy trình cha không?"
Tim

1
Mỗi quá trình chỉ có một cha mẹ, cho đến khi cha mẹ chết hoặc nó chết. Nếu nó chết, điểm là moot. Nếu cha mẹ chết, thì PPID trở thành 1, initquá trình. Đây là lần duy nhất quy trình cha sẽ thay đổi - khi quy trình cha kết thúc. Kết nối thông qua giao tiếp giữa các quá trình (đường ống, ổ cắm, v.v.) không ảnh hưởng đến PPID.
Arcege

Làm thế nào để Emacs gắn máy khách vào máy chủ trong các tab thiết bị đầu cuối khác nhau?
Tim

Máy chủ sẽ lắng nghe một ổ cắm (thường là tệp ổ cắm tên miền UNIX) đang chờ kết nối. (Các) khách hàng sẽ mở một kết nối trên ổ cắm đó. Các tab không liên quan đến giao tiếp giữa máy khách và máy chủ, nó có thể là các tab khác nhau, mô phỏng tạm thời khác nhau (xterm vs rxvt vs terminal) hoặc có thể là xemacs. Mỗi khách hàng biết nơi kết nối, vì vậy nó có thể từ bất cứ đâu.
Arcege

1
ID tiến trình cha mẹ không phải lúc nào cũng trở thành 1. Sự tuyệt đối khôn ngoan nhận được này đã sai trong hơn 3 năm nay.
JdeBP

-2

Tôi hiểu. Bạn cần thay đổi kernel để viết một số mô-đun để làm như vậy! Tôi nghĩ rằng nó sẽ hữu ích trong một số trường hợp. Ví dụ: bạn làm một số công việc nặng nhọc, họ mất nhiều tài nguyên trong một giờ ... Và khi hệ thống không phản hồi (như thường lệ trong trường hợp này), bạn sẽ thực hiện một số hành động không thể đoán trước (vì bạn cần phải làm và bạn không chắc chắn mình đã nhấp một con chuột ở đúng vị trí để hệ thống không phản hồi trong một thời gian dài) và giết chết quá trình cha mẹ vô tình. Hệ thống thường giết chết tất cả trẻ em! Nhưng nếu tiến trình con là root và cha mẹ chỉ là người dùng thứ tự và hành động thì cũng khiến người dùng thứ tự quá trình này không bị giết trong mọi trường hợp! Và cha mẹ của anh ta sẽ được khởi tạo với PID 1. Và sau khi hệ thống trả lời lần cuối, bạn muốn khôi phục hệ thống phân cấp. Nhưng bạn không thể !!! Tiêu chuẩn bạn bắt đầu nâng cấp hệ thống như root từ terminal như người dùng thông thường với su. Tại sao? Vì vậy, để có được tất cả các sai lầm và cảnh báo trên bàn điều khiển. Đặc biệt tiện ích cần nâng cấp là GUI. Họ không nhận được thông tin này ... Tôi nhớ trong hệ điều hành windows, điều này có thể được thực hiện. Có các chức năng WinAPI đặc biệt. Tại sao trong Linux điều này không thể được thực hiện? Nó không rõ ràng ... Điều đơn giản !!!

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.