BusyBox是一個遵循GPL協議、以自由軟件形式發行的應用程序。Busybox在單一的可執行文件中提供了精簡的Unix工具集,可運行於多款POSIX環境的操做系統,例如Linux(包括Android[6])、Hurd[7]、FreeBSD8等等。因爲BusyBox可執行文件的文件大小比較小、並一般使用Linux內核,這使得它很是適合使用於嵌入式系統。做者將BusyBox稱爲「嵌入式Linux的瑞士軍刀」git
BusyBox 內嵌了許多 Linux 經常使用的工具, cp,mv,cron 等。
這次分析 BusyBox 中的 cron 流程。原代碼在此github
流程以下shell
用戶輸入的 cron 配置通過解析後,存到以下兩個結構體中。c#
typedef struct CronFile { struct CronFile *cf_next; struct CronLine *cf_lines; char *cf_username; smallint cf_wants_starting; /* bool: one or more jobs ready */ smallint cf_has_running; /* bool: one or more jobs running */ smallint cf_deleted; /* marked for deletion (but still has running jobs) */ } CronFile; typedef struct CronLine { struct CronLine *cl_next; char *cl_cmd; /* shell command */ pid_t cl_pid; /* >0:running, <0:needs to be started in this minute, 0:dormant */ #define START_ME_REBOOT -2 #define START_ME_NORMAL -1 #if ENABLE_FEATURE_CROND_CALL_SENDMAIL int cl_empty_mail_size; /* size of mail header only, 0 if no mailfile */ char *cl_mailto; /* whom to mail results, may be NULL */ #endif char *cl_shell; /* ordered by size, not in natural order. makes code smaller: */ char cl_Dow[7]; /* 0-6, beginning sunday */ char cl_Mons[12]; /* 0-11 */ char cl_Hrs[24]; /* 0-23 */ char cl_Days[32]; /* 1-31 */ char cl_Mins[60]; /* 0-59 */ } CronLine;