1.實驗目的
通過編寫一個完整的守護進程,掌握守護進程編寫和調(diào)試的方法,進一步熟悉如何編寫多進程程序。
2.實驗內(nèi)容
在該實驗中,首先創(chuàng)建一個子進程1(守護進程),然后在該子進程中新建一個子進程2,該子進程2暫停10s,然后自動退出,并由子進程1收集子線程退出的消息。在這里,子進程1和子進程2的消息都在系統(tǒng)日志文件(如“/var/log/messages”,日志文件的全路徑名因Linux版本的不同可能會有所不同)中輸出。在向日志文件寫入消息后,守護進程(子進程1)循環(huán)暫停,其間隔時間為10s。
3.實驗步驟
(1)畫出該實驗流程圖。該程序流程圖如圖1所示。
 圖1 實驗流程圖
(2)實驗源代碼。具體代碼設(shè)置如下:
/* daemon_proc.c */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <syslog.h>
int main(void)
{
pid_t child1,child2;
int i;
/* 創(chuàng)建子進程1 */
child1 = fork();
if (child1 == 1)
{
perror("child1 fork");
exit(1);
}
else if (child1 > 0)
{
exit(0); /* 父進程退出 */
}
/* 打開日志服務 */
openlog("daemon_proc_info", LOG_PID, LOG_DAEMON);
/* 以下幾步是編寫守護進程的常規(guī)步驟 */
setsid();
chdir("/");
umask(0);
for(i = 0; i < getdtablesize(); i++)
{
close(i);
}
/* 創(chuàng)建子進程2 */
child2 = fork();
if (child2 == 1)
{
perror("child2 fork");
exit(1);
}
else if (child2 == 0)
{ /* 進程child2 */
/* 在日志中寫入字符串 */
syslog(LOG_INFO, " child2 will sleep for 10s ");
sleep(10);
syslog(LOG_INFO, " child2 is going to exit! ");
exit(0);
}
else
{ /* 進程child1 */
waitpid(child2, NULL, 0);
syslog(LOG_INFO, " child1 noticed that child2 has exited ");
/* 關(guān)閉日志服務 */
closelog();
while(1)
{
sleep(10);
}
}
}
(3)由于有些嵌入式開發(fā)板沒有syslog服務,讀者可以在宿主機上編譯運行,代碼如下:
$ gcc daemon_proc.c –o daemon_proc (或者使用Makefile)
(4)運行該程序。
(5)等待10s后,以root身份查看系統(tǒng)日志文件(如“/var/log/messages”)。
(6)使用ps-ef | grep daemon_proc查看該守護進程是否在運行。
4.實驗結(jié)果
(1)在系統(tǒng)日志文件中有類似如下的信息顯示:
Jul 20 21:15:08 localhost daemon_proc_info[4940]: child2 will sleep for 10s
Jul 20 21:15:18 localhost daemon_proc_info[4940]: child2 is going to exit!
Jul 20 21:15:18 localhost daemon_proc_info[4939]: child1 noticed that child2 has exited
讀者可以從時間戳里清楚地看到child2確實暫停了10s。
(2)使用命令ps-ef | grep daemon_proc可看到如下結(jié)果:
david 4939 1 0 21:15 ? 00:00:00 ./daemon_proc
可見,daemon_proc確實一直在運行。
本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發(fā)》
熱點鏈接:
1、Linux守護進程
2、Linux下多進程編程之exec函數(shù)語法及使用實例
3、Linux下多進程編程之fork()函數(shù)語法
4、Linux下多進程編程之fork()函數(shù)說明
5、Linux下進程的內(nèi)存結(jié)構(gòu)
更多新聞>> |