Init process doesn't exist !
đi uống cafê miễn phí không mọi người ?
»
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!
chuot@cuong ~ $./checkprocess
Init process does NOT exist
chuot@cuong ~ $
+ 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
-0là 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 (bashchẳng hạn). Lệnh tương ứng làkill -0 proccess_id. Đọc tài liệumanthông thường thì không có nói tới điều này.proccesskhô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ạiman, 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.FreeBSDvớisecurity.bsd.see_other_uids=1thì mình nghĩ là không thể nào đạt được yêu cầu về kiểm trainit proccess. Điều này cũng có thể đúng với các máy Linux chạy như làguesttrong mộtVirtual Machine Host.(vì đã lỡ xem
mannê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ô.
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.
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!
À, 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.
super userthì có thể xem đuợc đầy đủ cácproccesssuper usercó thể xem đượcinithay không. Mình sẽ kiểm tra lại điều này.Về cách ghi bài:
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.
Đơ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, ....
Bác tuanndh: bác thật sâu sắc :)
Trong các máy ảo như
freebsd jail, tiến trìnhinitkhô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,...)