This page is READ-ONLY. It is generated from the old site.
All timestamps are relative to 2013 (when this page is generated).
If you are looking for TeX support, please go to VietTUG.org

Init process doesn't exist !

đi uống cafê miễn phí không mọi người ?
Added by bronzeboyvn about 3 years ago  »  Votes: 1/1

Ta biết Init process tồn tại trong suốt quá trình họat động của hệ thống. Init process có pid (process id) = 1. Lệnh kill() được dùng để gởi tín hiệu tới một (hoặc nhiều) process. Tôi sẽ gởi "tín hiệu" với signum (signal number) 0 tới process 1 (tức là Init process). Thực sự nếu dùng signum 0, thì không có tín hiệu nào được gởi đến process 1. Nhưng trong trường hợp này hàm kill() vẫn được thi hành, dựa trên giá trị trả về của hàm ta biết process 1 có tồn tại hay không (một kĩ thuật kiểm tra sự tồn tại của process rất hay!).

Nếu hàm thành công (trả về 0), ta biết process 1 tồn tại.
Nếu hàm thất bại (trả về -1), ta biết process 1 không tồn tại.

 1 #include <stdio.h>
 2 #include <sys/types.h>
 3 #include <signal.h>
 4 
 5 int main()
 6 {
 7     if( kill(1, 0) == 0 )
 8         printf("Init process exists\n");
 9     else
10         printf("Init process does NOT exist\n");
11 
12     return 0;
13 }

Sau khi biên dịch source code thành file thực thi checkprocess. Tôi chạy file thực thi, thì output xuất ra thông báo Init process không tồn tại!

[email protected] ~ $./checkprocess
Init process does NOT exist
[email protected] ~ $

+ Sửa cái gì để chương trình chạy đúng như mình mong muốn ? (tức là chắc chắn phải là Init process đang tồn tại)

+ Tại sao cần phải sửa như vậy, chương trình mới thực thi đúng như mình mong muốn ?

Trả lời đúng 2 câu hỏi trên, bạn sẽ được mời một chầu cafê. Còn chờ gì nữa mà không đi uống cafê free!

PS: một vấn đề mình muốn nói thêm ở đây là ta gởi signum 0 đến process X, thật sự không có tín hiệu nào gởi đến process X cả. Nên việc bắt (dùng signal() hoặc sigaction()) và xử lý (bằng cách gọi hàm signal handler) signum 0 là điều ngu ngốc, và điều này mình đã từng gặp.


Comments

Added by about 3 years ago

  1. Tín hiệu -0 là cách rất hay để kiểm tra sự tồn tại của các tiến trình; nó cũng được dùng nhiều khi lập trình kịch bản (bash chẳng hạn). Lệnh tương ứng là kill -0 proccess_id. Đọc tài liệu man thông thường thì không có nói tới điều này.
  2. Trên hệ thống của mình (FreeBSD) thực hiện phép chặn, để người dùng không thể xem các proccess không thuộc quyền sở hữu của họ. Khi đó, chương trình của CT báo lỗi như trên là phải rồi :) Mình xem lại man, và thấy đúng là phải sử dụng quyền của nhóm quản trị hệ thống mới có thể truy cập tới tiến trình có id = 1.
  3. Như vậy, trên hệ thống FreeBSD với security.bsd.see_other_uids=1 thì mình nghĩ là không thể nào đạt được yêu cầu về kiểm tra init proccess. Điều này cũng có thể đúng với các máy Linux chạy như là guest trong một Virtual Machine Host.

(vì đã lỡ xem man nên chắc là không có được cà phê rồi haha)

PS: bình luận chưa có preview, bất tiện quá :)) Để thêm vô.

Added by bronzeboyvn about 3 years ago

Câu 1: Phải chuyển sang quyền super user, thì checkprocess chạy như mong muốn.
Câu 2, bây giờ rõ ràng hơn là : tại sao chỉ có super user mới được thực hiện lệnh kill -0 proccess_id ?
z trả lời mình không rõ lắm.

Added by bronzeboyvn about 3 years ago

Thêm nữa là mình bắt lỗi câu chữ ở đây:
người dùng không thể xem các proccess không thuộc quyền sở hữu của họ
Với câu lệnh "ps -ef" z có thể thấy init nằm đầu tiên trong danh sách, rồi tới các services chạy ở background do thằng init tạo ra. Nói chung z ngó cột thứ nhất, thấy quá trời processes của root show ra cho z xem.

{{{allow ~3}}}
Anh KA chỉ em cách làm blue highlight các từ trong bài viết với!

Added by about 3 years ago

À, mình nói miên man chứ không chú tâm trả lời hai câu hỏi của CT, nên làm khó hiểu.

  1. Nếu là super user thì có thể xem đuợc đầy đủ các proccess
  2. Nếu là người dùng bình thường, thì do cài đặt của hệ thống mà họ chỉ xem được các tiến trình mà họ tạo ra thôi. Trên Linux thông thường không có cài đặt này, còn trên FreeBSD thì mình đã chỉ ra ở trên
  3. Đối với các máy ảo (freebsd jail, linux chroot, openvz,...) thì mình không chắc là super user có thể xem được init hay không. Mình sẽ kiểm tra lại điều này.

Về cách ghi bài:

  1. Các từ khóa, mã chung dòng thì để trong cặp dấu a còng nó sẽ hiện ra chữ blue
  2. Chỉ thị khóa bài chỉ có tác dụng nếu để đầu bài viết thôi, không để trong thân bài được (làm giảm đi performance)

Added by bronzeboyvn about 3 years ago

Mình gác z lại ở đây, chờ xem tới cuối tuần có ai khác trả lời nữa không.

Added by about 3 years ago

Đơn giản là vì init không muốn chết :) global init là một process đặc biệt nó được kernel set SIGNAL_UNKILLABLE trước khi gọi. Ngoài ra cơ chế hoạt động của global init cũng đặc biệt, ví dụ: nó không handle bất cứ signal nào nó không muốn, ....

Added by about 3 years ago

Bác tuanndh: bác thật sâu sắc :)

Added by almost 3 years ago

Trong các máy ảo như freebsd jail, tiến trình init không tồn tại (do đó, bên trong máy ảo đó, không thể thực hiện các lệnh khởi động, tắt máy,...)