Tutorial Deamon
Daemon là một tiến trình đặc biệt được chạy trong chế độ background, và thường cung cấp các dịch vụ. Các tiến trình daemon thường bắt đầu vào thời điểm boot hệ thống và được chạy đến khi hệ thống được tạm nghỉ. Tất cả các daemon đều có các thuộc tính của một tiến trình thông thường.
• Fork
Việc đầu tiên tiến trình daemon cần làm là tạo ra một tiến trình con bằng lệnh gọi fork. Sau khi các tiến trình con được tạo, cả hai tiến trình con và tiến trình cha đồng chạy hai chương trình giống nhau cùng một lúc. Một tiến trình deamon sẽ cắt đứt liên hệ với chính nó từ tiến trình cha và đẩy nó chạy trong chế độ background.
• Create New Session
Bước tiếp theo là tạo một phiên làm việc mới, việc tạo ra một phiên làm việc mới đáp ứng cho ta một số lợi ích sau đây: Tiến trình sẽ trở thành một session leader của một nhóm tiến trình mới, và tiến trình sẽ không có trình điều khiển thiết bị đầu cuối.
• Close file descriptors
Tiến trình con kế thừa môi trường của nó từ tiến trình cha. Nếu tiến trình cha có mở một số thẻ file. Tiến trình con sẽ có một bản sao của các thẻ file này.
• Change the current working directory
Ngoài các thẻ file, tiến trình con còn kế thừa thư mục làm việc hiện hành. Nếu thư mục hiện hành được lắp vào trong hệ thống file, thì hệ thống file sẽ không có thể được tháo ra.
• Set file mode creation mask
Mặt nạ chắn quyền được kế thừa từ tiến trình cha, và có thể được thiết lập để cấm, và cấp quyền.
• Handle child Exit status
Nếu tiến trình daemon fork các tiến trình con để quản lý các đòi hỏi daemon phải quản lý tính hiệu SIGCHLD của tiến trình con hoặc tiến trình con sẽ trở thành zombie.
A Sketeton Daemon Funtion
The handle_sigcld Function
Nhắc lại nếu không lấy lại trạng thái exit code của tiến trình con, tiến trình con sẽ trở thành tiến trình zombie. Một tiến trình cha có thể tránh tạo ra các tiến trình zombie bởi việc cài đặt handle_sigcld để nắm bắt tính hiệu SIGCLD khi một tiến trình con kết thúc.
Code:
void handle_sigcld(){
int pid;
int status;
while((pid=wait3(&status, WNOHANG,(struct rusage* )NULL))<0);
}
+ Chú ý: hàm handle_sigcld gọi lời gọi hệ thống wait3 như WNOHANG. Điều này làm tiến trình cha tiếp tục thực thi và không dừng lại chờ tiến trình chờ tiến trình con kết thúc.
The init_daemon Function
void init_daemon(){
int childpid=0;
int fd=0;
struct rlimit max_files;
/*
** Tạo ra một tiến trình con
*/
if((childpid=fork())<0) {
/*Quản lý: điều kiện lỗi tạo tiến trình con*/
exit(-1);
}else if(childpid>0) {
/* Đoạn mã tiến trình cha ta thực hiện việc kết thúc nó*/
exit(0);
}
/* Bây giờ thực thi như một tiến trình con*/
/* Tạo session mới leader session*/
setsid();
/*
** Đóng tất cả các thẻ file, cần thiết lấy tối đa số lượng các file
**được mở từ getrlimit.
*/
bzero(&max_files,sizeof(struct rlimit));
getrlimit(RLIMIT_NOFILE,&max_file);
for(fd=0;fd<max_files.rlim_max;fd++){
close(fd);
}
/*
**Chuyển thư mục hiện hành về root
*/
chdir(“/”);
/*
**Thiết lập lại mặc nạ chắn quyền
*/
umask(0);
/*
** Thực hiện bắt tính hiệu SIGCHLD để tránh sự xuất hịên các tiến trình
** deamon
*/
signal(SIGCHLD
,handle_sigcld
); }