Viết daemon trên Linux (2)
Nguồn: http://www.enderunix.org/docs/eng/daemon.php
Bài viết này bổ xung một số vấn đề chưa được trình bày trong bài viết “Viết daemon trên Linux (1)” của anh Hoàng.
1- Logging
Chúng ta có thể lựa chọn một trong hai cách ghi log như sau:
- Tự viết hàm ghi log:
Một hàm ghi log có dạng như sau:
void log_message( const char *fname, const char *msg ) { FILE *logfile = fopen( fname, “a” ); if( ! logfile ) return; fprintf( logfile, “%s\n”, msg ); fclose( logfile ); }
- Dùng các hàm có sẵn trong thư viện: Standard C library có các hàm syslog(), openlog(), closelog() phục vụ việc ghi log.
2- Cơ chế loại trừ lẫn nhau
Tại một thời điểm thường chỉ có một thực thể của daemon đang chạy. Một thực thể của daemon sẽ cố gắng khóa một file (lock file). Nếu khóa thành công nghĩa là chưa có thực thể nào khác của daemon đó đang chạy. Khi đó, pid của thực thể sẽ được ghi vào lock file. Chúng ta sử dụng hàm chuẩn lockf() như sau:
lfp = open( "exampled.lock", O_RDWR | O_CREAT, 0640 ); if ( lfp < 0 ) /* không mở được lock file */ exit( EXIT_FAILURE ); if ( lockf( lfp, F_TLOCK, 0 ) < 0 ) /* không khóa được lock file, một thực thể khác đang chạy */ exit( EXIT_SUCCESS ); /* chưa có thực thể nào đang chạy, ghi pid vào lock file */ sprintf( str,"%d\n", getpid() ); write( lfp, str, strlen(str) );
3- Bắt các tín hiệu gửi đến
Sau các bước chuẩn bị nói trên, một daemon sẽ bắt đầu lắng nghe tín hiệu gửi đến từ người dùng hoặc từ các tiến trình khác. Chúng ta viết một hàm xử lí tín hiệu, sau đó gán hàm đó với các tín hiệu cụ thể nhờ hàm chuẩn signal(): (more…)