Linux進(jìn)程的創(chuàng)建與銷毀

Linux操作系統(tǒng)是一種多任務(wù)盛嘿、多用戶的操作系統(tǒng),這意味著它可以同時運(yùn)行多個進(jìn)程坡贺,每個進(jìn)程都可以執(zhí)行不同的任務(wù)。

在本文中箱舞,我們將介紹如何在Linux系統(tǒng)中創(chuàng)建和銷毀進(jìn)程遍坟。

進(jìn)程的創(chuàng)建

在Linux系統(tǒng)中,進(jìn)程的創(chuàng)建可以通過fork()系統(tǒng)調(diào)用來實(shí)現(xiàn)褐缠。

fork()函數(shù)將當(dāng)前進(jìn)程復(fù)制一份政鼠,創(chuàng)建一個新的進(jìn)程。

新進(jìn)程的代碼队魏、數(shù)據(jù)和堆棧等信息都是從原進(jìn)程復(fù)制而來的公般。fork()函數(shù)返回兩個值万搔,對于父進(jìn)程,它返回子進(jìn)程的進(jìn)程ID(PID)官帘,對于子進(jìn)程瞬雹,它返回0。

下面是一個使用fork()函數(shù)創(chuàng)建子進(jìn)程的C語言程序:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    pid_t pid;

    pid = fork();

    if (pid == -1) {
        printf("Failed to fork.\n");
        return 1;
    }

    if (pid == 0) {
        printf("I am the child process %d. parent PID is %d.\n", getpid(),getppid());
        // 這里是子進(jìn)程的代碼
    } else {
        printf("I am the parent process %d, child PID is %d.\n",getpid(),pid);
        // 這里是父進(jìn)程的代碼
    }

    return 0;
}

運(yùn)行編譯好的程序刽虹,打印信息如下

I am the parent process 3891, child PID is 3892.
I am the child process 3892. parent PID is 3891.

在這個程序中酗捌,我們首先聲明了一個pid_t類型的變量pid,它用于存儲fork()函數(shù)的返回值涌哲。接著胖缤,我們調(diào)用fork()函數(shù),并根據(jù)返回值判斷當(dāng)前是父進(jìn)程還是子進(jìn)程阀圾。如果返回值為-1哪廓,說明fork()函數(shù)調(diào)用失敗,程序?qū)⒅苯油顺龀鹾妗H绻祷刂禐?涡真,說明當(dāng)前是子進(jìn)程,程序?qū)?zhí)行子進(jìn)程的代碼肾筐。否則哆料,說明當(dāng)前是父進(jìn)程,程序?qū)?zhí)行父進(jìn)程的代碼吗铐。

進(jìn)程的銷毀

在Linux系統(tǒng)中东亦,進(jìn)程的銷毀可以通過exit()系統(tǒng)調(diào)用來實(shí)現(xiàn)。exit()函數(shù)將當(dāng)前進(jìn)程終止唬渗,并返回一個退出狀態(tài)讥此。如果進(jìn)程沒有調(diào)用exit()函數(shù)而直接退出,系統(tǒng)會自動調(diào)用exit()函數(shù)谣妻。

下面是一個使用exit()函數(shù)終止進(jìn)程的C語言程序:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() 
{
    pid_t pid;

    // 創(chuàng)建子進(jìn)程
    pid = fork();

    if (pid < 0) {
        fprintf(stderr, "創(chuàng)建子進(jìn)程失敗\n");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        // 子進(jìn)程代碼
        printf("子進(jìn)程開始執(zhí)行,PID is %d.\n",getpid());
        sleep(10);
        printf("子進(jìn)程執(zhí)行完畢\n");
        exit(EXIT_SUCCESS);
    } else {
        // 父進(jìn)程代碼
        printf("父進(jìn)程開始執(zhí)行\(zhòng)n");
        sleep(5);
        printf("父進(jìn)程執(zhí)行完畢\n");

        // 等待子進(jìn)程結(jié)束
        int status;
        waitpid(pid, &status, 0);

        if (WIFEXITED(status)) {
            printf("子進(jìn)程正常結(jié)束萄喳,退出狀態(tài)為%d\n", WEXITSTATUS(status));
        } else if (WIFSIGNALED(status)) {
            printf("子進(jìn)程被信號中斷,信號編號為%d\n", WTERMSIG(status));
        } else {
            printf("子進(jìn)程其他未知狀態(tài)\n");
        }
    }

    return 0;
}

該程序首先使用fork()函數(shù)創(chuàng)建一個子進(jìn)程蹋半,并在子進(jìn)程中執(zhí)行一些操作他巨,然后父進(jìn)程等待一段時間后結(jié)束,并使用waitpid()函數(shù)等待子進(jìn)程結(jié)束减江。子進(jìn)程在執(zhí)行完畢后調(diào)用exit()函數(shù)退出染突。在父進(jìn)程中,可以通過waitpid()函數(shù)獲取子進(jìn)程的退出狀態(tài)辈灼。最后份企,程序結(jié)束并返回0。

  • 編譯后運(yùn)行程序巡莹,正常運(yùn)行打印信息如下
父進(jìn)程開始執(zhí)行
子進(jìn)程開始執(zhí)行,PID is 4013.
父進(jìn)程執(zhí)行完畢
子進(jìn)程執(zhí)行完畢
子進(jìn)程正常結(jié)束司志,退出狀態(tài)為0
  • 運(yùn)行后甜紫,終端輸入kill - 9 4015 強(qiáng)制結(jié)束子進(jìn)程,打印如下
父進(jìn)程開始執(zhí)行
子進(jìn)程開始執(zhí)行,PID is 4015.
父進(jìn)程執(zhí)行完畢
子進(jìn)程被信號中斷骂远,信號編號為9

小結(jié)

在Linux系統(tǒng)中囚霸,進(jìn)程的創(chuàng)建可以通過fork()系統(tǒng)調(diào)用來實(shí)現(xiàn),進(jìn)程的銷毀可以通過exit()系統(tǒng)調(diào)用來實(shí)現(xiàn)激才。

以上拓型,如果覺得對你有幫助,點(diǎn)個贊再走吧瘸恼,這樣@知微之見也有更新下去的動力劣挫!

也歡迎私信我,一起交流东帅!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揣云,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冰啃,更是在濱河造成了極大的恐慌,老刑警劉巖刘莹,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阎毅,死亡現(xiàn)場離奇詭異,居然都是意外死亡点弯,警方通過查閱死者的電腦和手機(jī)扇调,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抢肛,“玉大人狼钮,你說我怎么就攤上這事〖裥酰” “怎么了熬芜?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長福稳。 經(jīng)常有香客問我涎拉,道長,這世上最難降的妖魔是什么的圆? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任鼓拧,我火速辦了婚禮,結(jié)果婚禮上越妈,老公的妹妹穿的比我還像新娘季俩。我一直安慰自己,他們只是感情好梅掠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布酌住。 她就那樣靜靜地躺著店归,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赂韵。 梳的紋絲不亂的頭發(fā)上娱节,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音祭示,去河邊找鬼肄满。 笑死,一個胖子當(dāng)著我的面吹牛质涛,可吹牛的內(nèi)容都是我干的稠歉。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼汇陆,長吁一口氣:“原來是場噩夢啊……” “哼怒炸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起毡代,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤阅羹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后教寂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捏鱼,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年酪耕,在試婚紗的時候發(fā)現(xiàn)自己被綠了导梆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡迂烁,死狀恐怖看尼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盟步,我是刑警寧澤藏斩,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站却盘,受9級特大地震影響灾茁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谷炸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一北专、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旬陡,春花似錦拓颓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砰左。三九已至,卻和暖如春场航,著一層夾襖步出監(jiān)牢的瞬間缠导,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工溉痢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留僻造,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓孩饼,卻偏偏與公主長得像髓削,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子镀娶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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