青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

守護(hù)進(jìn)程

Posted on 2009-03-13 20:39 Prayer 閱讀(463) 評(píng)論(0)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX

實(shí)現(xiàn)守護(hù)進(jìn)程的步驟

守護(hù)進(jìn)程(Daemon)是運(yùn)行在后臺(tái)的一種特殊進(jìn)程。它獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。守護(hù)進(jìn)程是一種很有用的進(jìn)程。Linux的大多數(shù)服務(wù)器就是用守護(hù)進(jìn)程實(shí)現(xiàn)的。比如,Internet服務(wù)器inetd,Web服務(wù)器httpd等。同時(shí),守護(hù)進(jìn)程完成許多系統(tǒng)任務(wù)。比如,作業(yè)規(guī)劃進(jìn)程crond,打印進(jìn)程lpd等。

在Linux系統(tǒng)中,要編程實(shí)現(xiàn)一個(gè)守護(hù)進(jìn)程必須遵守如下的步驟。

1.讓init進(jìn)程成為新產(chǎn)生進(jìn)程的父進(jìn)程。

調(diào)用fork函數(shù)創(chuàng)建子進(jìn)程后,使父進(jìn)程立即退出。這樣,產(chǎn)生的子進(jìn)程將變成孤兒進(jìn)程,并被init進(jìn)程接管,同時(shí),所產(chǎn)生的新進(jìn)程將變?yōu)樵诤笈_(tái)運(yùn)行。

2.調(diào)用setsid函數(shù)

通過調(diào)用setsid函數(shù),使得新創(chuàng)建的進(jìn)程脫離控制終端,同時(shí)創(chuàng)建新的進(jìn)程組,并成為該進(jìn)程組的首進(jìn)程。為了使讀者更好地理解這一步驟,下面介紹進(jìn)程組、會(huì)話(session)的基本概念。

在Linux系統(tǒng)中,所有的進(jìn)程都屬于各自的進(jìn)程組。進(jìn)程組是一個(gè)或多個(gè)進(jìn)程的集合。打個(gè)比方,可以認(rèn)為某個(gè)班級(jí)是一個(gè)進(jìn)程組,而其中成員就是進(jìn)程。一個(gè)班級(jí)至少有一個(gè)成員。當(dāng)一個(gè)班級(jí)的最后一個(gè)成員不存在的時(shí)候,這個(gè)班級(jí)也就不存在了,也就是進(jìn)程組消亡了。

每個(gè)進(jìn)程組都有類似于進(jìn)程號(hào)的標(biāo)識(shí),稱為進(jìn)程組ID。進(jìn)程組ID是由領(lǐng)頭進(jìn)程的進(jìn)程號(hào)決定的,每個(gè)進(jìn)程組都存在一個(gè)領(lǐng)頭進(jìn)程。進(jìn)程組的存在與否與領(lǐng)頭進(jìn)程是否存在沒有關(guān)系。

會(huì)話是一個(gè)或多個(gè)進(jìn)程組的集合。與進(jìn)程組類似,每個(gè)會(huì)話都存在一個(gè)領(lǐng)頭進(jìn)程。Linux是一個(gè)多用戶的操作系統(tǒng),在同一時(shí)刻系統(tǒng)中會(huì)存在屬于不同用戶的多個(gè)進(jìn)程。如果用戶在某個(gè)終端上發(fā)送了某個(gè)信號(hào),例如,按下“Ctrl+C”發(fā)送SIGINT信號(hào),如何確保信號(hào)被正確地發(fā)送到對(duì)應(yīng)的進(jìn)程,同時(shí)不會(huì)影響使用其他終端的用戶的進(jìn)程?

會(huì)話和進(jìn)程組是Linux內(nèi)核用于管理多用戶情況下用戶進(jìn)程的方法。每個(gè)進(jìn)程都屬于一個(gè)進(jìn)程組,而進(jìn)程組又屬于某個(gè)會(huì)話。當(dāng)用戶從終端登錄系統(tǒng)(不管是終端還是偽終端),系統(tǒng)會(huì)創(chuàng)建一個(gè)新的會(huì)話。在該終端上啟動(dòng)的進(jìn)程都會(huì)被系統(tǒng)劃歸到會(huì)話的進(jìn)程組中。

會(huì)話中的進(jìn)程通過該會(huì)話中的領(lǐng)頭進(jìn)程(常稱其為控制進(jìn)程)與一個(gè)終端相連。該終端是會(huì)話的控制終端。一個(gè)會(huì)話只能有一個(gè)控制終端,反之一樣。如果會(huì)話存在一個(gè)控制終端,則它必然擁有一個(gè)前臺(tái)進(jìn)程組。屬于該組的進(jìn)程可以從控制終端獲得輸入。這時(shí),其他的進(jìn)程組都為后臺(tái)進(jìn)程組。圖8.3所示為會(huì)話、進(jìn)程組、進(jìn)程與控制終端之間的關(guān)系。

圖8.3 會(huì)話、進(jìn)程組、進(jìn)程與控制終端的關(guān)系

由于守護(hù)進(jìn)程沒有控制終端,而使用fork函數(shù)創(chuàng)建的子進(jìn)程繼承了父進(jìn)程的控制終端、會(huì)話和進(jìn)程組,因此,必須創(chuàng)建新的會(huì)話,以脫離父進(jìn)程的影響。Linux系統(tǒng)提供了setsid函數(shù)用于創(chuàng)建新的會(huì)話。setsid函數(shù)的信息如表8.1所示。

表8.1                                                             setsid函數(shù)

頭文件

<unistd.h>

函數(shù)形式

pid_t setsid(void);

返回值

成功

失敗

是否設(shè)置errno

調(diào)用進(jìn)程的會(huì)話ID

−1

setsid函數(shù)將創(chuàng)建新的會(huì)話,并使得調(diào)用setsid函數(shù)的進(jìn)程成為新會(huì)話的領(lǐng)頭進(jìn)程。調(diào)用setsid函數(shù)的進(jìn)程是新創(chuàng)建會(huì)話中的惟一的進(jìn)程組,進(jìn)程組ID為調(diào)用進(jìn)程的進(jìn)程號(hào)。setsid函數(shù)產(chǎn)生這一結(jié)果還有個(gè)條件,即調(diào)用進(jìn)程不為一個(gè)進(jìn)程的領(lǐng)頭進(jìn)程。由于在第一步中調(diào)用fork的父進(jìn)程退出,使得子進(jìn)程不可能是進(jìn)程組的領(lǐng)頭進(jìn)程。該會(huì)話的領(lǐng)頭進(jìn)程沒有控制終端與其相連。至此,滿足了守護(hù)進(jìn)程沒有控制終端的要求。

3.更改當(dāng)前工作目錄

使用fork函數(shù)產(chǎn)生的子進(jìn)程將繼承父進(jìn)程的當(dāng)前工作目錄。當(dāng)進(jìn)程沒有結(jié)束時(shí),其工作目錄是不能被卸載的。為了防止這種問題發(fā)生,守護(hù)進(jìn)程一般會(huì)將其工作目錄更改到根目錄下(/目錄)。更改工作目錄使用的函數(shù)是chdir。

4.關(guān)閉文件描述符,并重定向標(biāo)準(zhǔn)輸入、輸出和錯(cuò)誤輸出

新產(chǎn)生的進(jìn)程從父進(jìn)程繼承了某些打開的文件描述符,如果不使用這些文件描述符,則需要關(guān)閉它們。守護(hù)進(jìn)程是運(yùn)行在系統(tǒng)后臺(tái)的,不應(yīng)該在終端有任何的輸出信息??梢允褂胐up函數(shù)將標(biāo)準(zhǔn)輸入、輸出和錯(cuò)誤輸出重定向到/dev/null設(shè)備上(/dev/null是一個(gè)空設(shè)備,向其寫入數(shù)據(jù)不會(huì)有任何輸出)。下面給出具體的代碼:

      int fd;

      //將標(biāo)準(zhǔn)輸入輸出重定向到空設(shè)備

      fd = open ("/dev/null", O_RDWR, 0);

      if (fd != -1)

    {

       dup2 (fd, STDIN_FILENO);

       dup2 (fd, STDOUT_FILENO);

      dup2 (fd, STDERR_FILENO);

      if (fd > 2)

        close (fd);

    }

5.設(shè)置守護(hù)進(jìn)程的文件權(quán)限創(chuàng)建掩碼

很多情況下,守護(hù)進(jìn)程會(huì)創(chuàng)建一些臨時(shí)文件。出于安全性的考慮,往往不希望這些文件被別的用戶查看。這時(shí),可以使用umask函數(shù)修改文件權(quán)限,創(chuàng)建掩碼的取值,以滿足守護(hù)進(jìn)程的要求。

8.2.2 守護(hù)進(jìn)程具體實(shí)現(xiàn)

本節(jié)給出一個(gè)守護(hù)進(jìn)程創(chuàng)建的實(shí)例。程序p8.1.c中定義了daemon函數(shù),用于實(shí)現(xiàn)對(duì)守護(hù)進(jìn)程的創(chuàng)建。其創(chuàng)建思想在8.2.1中有詳細(xì)的介紹,程序的具體代碼如下:

//p8.1.c 守護(hù)進(jìn)程的實(shí)現(xiàn)

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

/* daemon函數(shù)用于將調(diào)用函數(shù)的進(jìn)程轉(zhuǎn)化為守護(hù)進(jìn)程 */

int

daemon (int nochdir, int noclose)

{

pid_t pid;

pid = fork ();

/* 如果創(chuàng)建進(jìn)程失敗 */

if (pid < 0)

    {

      perror ("fork");

      return -1;

    }

/* 父進(jìn)程退出運(yùn)行 */

if (pid != 0)

    exit (0);

/* 成為會(huì)話領(lǐng)頭進(jìn)程 */

pid = setsid();

if (pid < -1)

    {

      perror ("setsid");

      return -1;

    }

/* 將工作目錄修改成根目錄 */

if (! nochdir)

    chdir ("/");

/* 將標(biāo)準(zhǔn)輸入輸出重定向到空設(shè)備 */

if (! noclose)

    {

      int fd;

      fd = open ("/dev/null", O_RDWR, 0);

      if (fd != -1)

    {

      dup2 (fd, STDIN_FILENO);

      dup2 (fd, STDOUT_FILENO);

      dup2 (fd, STDERR_FILENO);

      if (fd > 2)

        close (fd);

    }

    }

umask (0027);

return 0;

}

int main(void)

{

       daemon(0,0);

       sleep(1000);

   

       return 0;

}  

使用gcc編譯p8.1.c,得到名為p8.1的可執(zhí)行文件。執(zhí)行該程序,程序?qū)⒁允刈o(hù)進(jìn)程的狀態(tài)運(yùn)行,如圖8.4所示。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            中文日韩电影网站| 亚洲午夜精品久久久久久app| 国产精品男女猛烈高潮激情 | 国产一区二区三区在线观看免费 | 欧美久久久久久| 亚洲欧美美女| 伊人成人在线视频| 激情丁香综合| 亚洲第一福利社区| 今天的高清视频免费播放成人| 国产精品一香蕉国产线看观看 | 久久亚洲国产精品一区二区 | 一本色道88久久加勒比精品| 亚洲第一区在线| 99这里只有精品| 亚洲成人自拍视频| 在线日韩欧美| 亚洲最黄网站| 久久久久久九九九九| 欧美成人午夜激情在线| 亚洲人成7777| 亚洲欧美国产高清| 久久精品二区三区| 欧美日韩精品中文字幕| 国产精品推荐精品| 99精品国产一区二区青青牛奶| 欧美**字幕| 免费精品视频| 国产日韩欧美三区| 99国内精品久久| 久久精品国产欧美亚洲人人爽| 亚洲黄色天堂| 久久精品国产69国产精品亚洲| 欧美日韩在线精品| 亚洲精品日韩综合观看成人91| 欧美激情一区二区三区在线| 欧美日韩另类视频| 亚洲国产成人精品久久久国产成人一区| 一区二区三区毛片| 欧美成人高清视频| 美国十次成人| 国产一区二区三区四区五区美女 | 欧美激情一区三区| 国产在线精品自拍| 久久国产乱子精品免费女 | 日韩视频中文| 欧美va日韩va| 免费观看成人鲁鲁鲁鲁鲁视频| 国产一区视频网站| 亚洲第一区中文99精品| 久久一区二区三区国产精品| 国产一区二区三区久久| 欧美**字幕| 国产精品日本一区二区| 久久久91精品| 欧美激情免费观看| 亚洲午夜在线观看视频在线| 亚洲视频图片小说| 国产一区视频网站| 亚洲日本aⅴ片在线观看香蕉| 国产精品久久一区主播| 看欧美日韩国产| 欧美国产三区| 欧美视频中文一区二区三区在线观看| 一区二区精品国产| 亚洲综合色在线| 欧美三级视频在线| 一区二区三区精密机械公司 | 黑人中文字幕一区二区三区| 噜噜噜91成人网| 国产精品久久久久av免费| 另类成人小视频在线| 欧美激情中文字幕乱码免费| 亚洲小说区图片区| 欧美精品一区二区在线观看 | 99re6热只有精品免费观看| 欧美激情久久久久久| 国产区在线观看成人精品| 亚洲精品中文字| 亚洲电影在线看| 久久久爽爽爽美女图片| 亚洲影视在线| 欧美三区不卡| 日韩系列欧美系列| 亚洲天堂成人在线观看| 欧美精品大片| 亚洲少妇中出一区| 欧美一区二区三区四区视频| 欧美亚州一区二区三区 | 亚洲综合欧美日韩| 欧美日韩综合在线免费观看| 亚洲图片欧美一区| 亚洲一级在线观看| 红桃视频一区| 欧美日本一区二区高清播放视频| 亚洲国产精品久久久久婷婷884| 亚洲国产一区二区三区在线播| 免费观看一区| 亚洲在线视频观看| 国产精品女同互慰在线看| 亚洲免费观看在线视频| 欧美一级精品大片| 亚洲第一综合天堂另类专| 欧美国产一区视频在线观看| 99成人在线| 亚洲国产精品久久久久婷婷老年| 亚洲老司机av| 136国产福利精品导航| 国产精品高清在线| 欧美精品久久久久久| 欧美中文字幕不卡| 亚洲性色视频| 亚洲视频电影在线| 99精品视频一区| 91久久在线播放| 亚洲国产成人av| 久久久91精品国产一区二区精品| 中国成人亚色综合网站| 亚洲精品少妇网址| 一本色道久久综合亚洲二区三区 | 国产精品免费久久久久久| 欧美极品aⅴ影院| 欧美日韩大片| 欧美午夜女人视频在线| 欧美四级在线| 国产久一道中文一区| 国产一区二区福利| 很黄很黄激情成人| 亚洲一区二区成人| 亚洲国产成人tv| 亚洲第一狼人社区| 在线综合亚洲欧美在线视频| 亚洲欧美日韩国产中文| 久久国产精品久久久久久电车| 久久精品一区二区| 欧美日韩不卡| 国内精品免费在线观看| 亚洲美女色禁图| 午夜精品一区二区三区电影天堂 | 久久躁日日躁aaaaxxxx| 蜜桃av综合| 亚洲一区二区影院| 欧美好吊妞视频| 国产欧美精品xxxx另类| 亚洲国产精品国自产拍av秋霞| 在线一区亚洲| 欧美高清一区二区| 久久aⅴ国产欧美74aaa| 国产精品久久看| 中日韩高清电影网| 欧美国产高清| 久久国产精品99国产| 欧美视频一区在线| 日韩亚洲欧美综合| 亚洲国产91色在线| 蜜乳av另类精品一区二区| 狠狠色丁香婷婷综合| 久久精品国产亚洲一区二区三区| 夜夜嗨av一区二区三区四季av| 欧美aa在线视频| 亚洲精品视频在线观看免费| 欧美国产一区二区三区激情无套| 久久国产欧美| 在线高清一区| 亚洲国产小视频| 欧美日韩在线精品| 欧美一区二区三区免费在线看| 亚洲欧美另类综合偷拍| 国内免费精品永久在线视频| 免费在线看一区| 欧美日韩亚洲国产一区| 欧美一区二区三区四区夜夜大片| 香蕉免费一区二区三区在线观看 | 亚洲国产精品va在线看黑人| 欧美性一二三区| 午夜在线精品偷拍| 久久久蜜臀国产一区二区| 亚洲精品偷拍| 久久精品国产99国产精品澳门| 影音先锋日韩资源| 亚洲最快最全在线视频| 国内精品美女av在线播放| 亚洲精品国产精品乱码不99按摩 | 久久xxxx| 亚洲在线黄色| 久久久久久久综合狠狠综合| 午夜一区二区三区在线观看 | 午夜日韩在线观看| 一区二区激情视频| 你懂的一区二区| 久久婷婷影院| 国产亚洲二区| 亚洲欧美日韩一区二区三区在线| 亚洲精品综合在线| 欧美成人高清视频| 欧美成人一区二免费视频软件| 国产精品青草综合久久久久99| 99re66热这里只有精品3直播 | 欧美激情一区二区三区蜜桃视频 | 免费日韩视频|