Linux守護進程和線程

守護進程daemon

守護進程概念就不贅述了,挺好理解的,從名字都能看出來。
查看

ps -ajx

其中TPGID為-1的代表daemon進程盟庞。

創(chuàng)建daemon進程有兩種方法:

方法1:
 #include<unistd.h>
 pid_t setsid(void);

當調(diào)用這個函數(shù)的時候不允許當前進程為進程組的Leader吃沪,所以一般都fork一個子進程。

#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
void daemonize()
{
    pid_t pid;
    pid = fork();
    if(pid > 0){
        exit(0);
    }else if(pid == 0){
        setsid();
        //改變工作目錄
        chdir("/");
        //下面將關(guān)閉終端和標準輸入輸出
        close(0);
        open("dev/null", O_RDONLY);
        dup2(0, 1);
        dup2(0, 2);
    }
}

int main(void)
{
    daemonize();
    while(1){
        //running
    }
}
damon
方法2:

使用庫函數(shù)daemon(man 3 daemon)來創(chuàng)建daemon進程什猖。

man 3 daemon看一下

#include <unistd.h>
int daemon(int nochdir, int noclose);

兩個參數(shù)的特別說明

If nochdir is zero, daemon() changes the process’s current working directory to the root directory ("/"); otherwise,
If noclose is zero, daemon() redirects standard input, standard output and standard error to /dev/null; otherwise, no changes are made to these file descriptors.

代碼就很簡單了

#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>

int main(void)
{
    daemon(0, 0);
    while(1){
        //running
    }
}

線程

線程概念也不再贅述了票彪。線程之間共享:

  • 文件描述符
  • 信號的處理方式
  • 當前的工作目錄
  • 用戶id和組id

不共享:

  • 線程id
  • 上下文,包括各種寄存器的值不狮、程序計數(shù)器和棧指針
  • 椊抵空間
  • errno 變量
  • 信號屏蔽字
  • 調(diào)度優(yōu)先級

創(chuàng)建線程

#include <pthread.h>
int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);

注意:

在Linux上線程函數(shù)位于libpthread共享庫中,因此在編譯時要加上-lpthread選項

man 3 pthread_create 看一下

The pthread_create() function starts a new thread in the calling process.The new thread starts execution by invoking start_routine(); arg is passed as the sole argument of start_routine().
RETURN VALUE:On success, pthread_create() returns 0; on error, it returns an error number, and the contents of *thread are undefined.

意思大概是新啟動一個線程就會激活第3個參數(shù)所指向的函數(shù)摇零,最后一個參數(shù)是所激活函數(shù)的參數(shù)推掸。成功時返回0,否則返回錯誤編號驻仅。

線程的終止:

  • 線程函數(shù)調(diào)用return谅畅,會終止當前線程,若是主線程噪服,則等同exit毡泻,會結(jié)束進程;
  • pthread_cancel 終止同一進程中的其他線程;
  • pthread_exit 終止自己的線程。
 #include<pthread.h>
 void pthread_exit(void *value_ptr);

這個函數(shù)的參數(shù)是可以通過函數(shù)pthread_join獲得粘优。

#include<pthread.h>
int pthread_join(pthread_t thread, void **value_ptr);

調(diào)用該函數(shù)的線程將掛起等待仇味,直到id為thread的線程終止。thread線程以不同的方法終止雹顺,通過pthread_join得到的終止狀態(tài)是不同的:

  • 如果thread線程通過return返回丹墨,value_ptr所指向的單元里存放的是thread線程函數(shù)的返回值;
  • 如果thread線程被別的線程調(diào)用pthread_cancel異常終止掉,value_ptr所指向的單元里存放的是常數(shù)PTHREAD_CANCELED;
  • 如果thread線程是自己調(diào)用pthread_exit終止的嬉愧,value_ptr所指向的單元存放的是傳給pthread_exit的參數(shù)带到。

后面的線程同步異步的控制就不展開說了,在讀書的時候這塊是重點英染,都是算法揽惹。
下面寫個簡單例子驗證一下:

#include<stdio.h>
#include<pthread.h>

void *running()
{
    pthread_t pid;
    pid = pthread_self();
    printf("thread,pid: 0x%u ,is running....\n", pid);
}

int main(void)
{
    pthread_t ntid[3];
    void *tret;
    int i;
    for(i=0; i<3; i++)
    {
        pthread_create(&ntid[i], NULL, running, NULL);
        sleep(1);
    }
    pthread_join(ntid[0], &tret);
    printf("thread 1,exit code %d\n", tret);
    pthread_join(ntid[1], &tret);
    printf("thread 2,exit code %d\n", tret);
    pthread_cancel(ntid[2]);
    pthread_join(ntid[2], &tret);
    printf("thread 3,exit code %d\n", tret);
    return 0;
}

附上運行截圖:


thread
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市四康,隨后出現(xiàn)的幾起案子搪搏,更是在濱河造成了極大的恐慌,老刑警劉巖闪金,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疯溺,死亡現(xiàn)場離奇詭異论颅,居然都是意外死亡,警方通過查閱死者的電腦和手機囱嫩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門恃疯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人墨闲,你說我怎么就攤上這事今妄。” “怎么了鸳碧?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵盾鳞,是天一觀的道長。 經(jīng)常有香客問我瞻离,道長腾仅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任套利,我火速辦了婚禮推励,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肉迫。我一直安慰自己吹艇,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布昂拂。 她就那樣靜靜地躺著受神,像睡著了一般。 火紅的嫁衣襯著肌膚如雪格侯。 梳的紋絲不亂的頭發(fā)上鼻听,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音联四,去河邊找鬼撑碴。 笑死,一個胖子當著我的面吹牛朝墩,可吹牛的內(nèi)容都是我干的醉拓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼收苏,長吁一口氣:“原來是場噩夢啊……” “哼亿卤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鹿霸,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤排吴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后懦鼠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钻哩,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡屹堰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了街氢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扯键。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖珊肃,靈堂內(nèi)的尸體忽然破棺而出荣刑,到底是詐尸還是另有隱情,我是刑警寧澤近范,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站延蟹,受9級特大地震影響评矩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阱飘,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一斥杜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沥匈,春花似錦蔗喂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至散址,卻和暖如春乖阵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背预麸。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工瞪浸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吏祸。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓对蒲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贡翘。 傳聞我的和親對象是個殘疾皇子蹈矮,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Linux-創(chuàng)建進程與線程用到的函數(shù)解析 【1】exit: exit函數(shù)可以退出程序并將控制權(quán)返回給操作系統(tǒng),而用...
    Yojiaku閱讀 3,601評論 0 2
  • 轉(zhuǎn)自:Youtherhttps://www.cnblogs.com/youtherhome/archive/201...
    njukay閱讀 1,612評論 0 52
  • 線程 在linux內(nèi)核那一部分我們知道鸣驱,線程其實就是一種特殊的進程含滴,只是他們共享進程的文件和內(nèi)存等資源,無論如何對...
    大雄good閱讀 668評論 0 2
  • 大學丐巫,是所有學生夢寐以求的谈况,青春勺美,到底什么是青春?是初中時期的懵懂碑韵,高中時期的暗戀赡茸,還是大學時期的甜蜜,又或者是社...
    佳佳_ec70閱讀 381評論 0 0
  • 每個人對于“垃圾牌”知識的定義不盡相同,我的定義是放錯了時間和空間的知識联喘。 這個話題的觸發(fā)是一早接到朋友的電話华蜒,聽...
    幸運的老師閱讀 296評論 0 0