国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux操作系統(tǒng)】深入探索Linux進(jìn)程:創(chuàng)建、共享與管理

這篇具有很好參考價(jià)值的文章主要介紹了【Linux操作系統(tǒng)】深入探索Linux進(jìn)程:創(chuàng)建、共享與管理。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

進(jìn)程的創(chuàng)建是Linux系統(tǒng)編程中的重要概念之一。在本節(jié)中,我們將介紹進(jìn)程的創(chuàng)建、獲取進(jìn)程ID和父進(jìn)程ID、進(jìn)程共享、exec函數(shù)族、wait和waitpid等相關(guān)內(nèi)容。
【Linux操作系統(tǒng)】深入探索Linux進(jìn)程:創(chuàng)建、共享與管理,操作系統(tǒng),linux,運(yùn)維,服務(wù)器


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

在Linux系統(tǒng)中,進(jìn)程的創(chuàng)建使用fork()系統(tǒng)調(diào)用。fork()系統(tǒng)調(diào)用會(huì)創(chuàng)建一個(gè)與當(dāng)前進(jìn)程相同的子進(jìn)程,子進(jìn)程會(huì)復(fù)制父進(jìn)程的所有資源,包括代碼、數(shù)據(jù)和文件描述符等。


1.1 函數(shù)原型和返回值

fork()函數(shù)的原型如下:

#include <unistd.h>

pid_t fork(void);

fork()函數(shù) 沒(méi)有任何參數(shù) ,它的返回值是一個(gè)pid_t類型的整數(shù)。具體解釋如下:

  • 如果調(diào)用成功,fork()函數(shù)會(huì)在父進(jìn)程中返回子進(jìn)程的PID(子進(jìn)程ID),在子進(jìn)程中返回0。
  • 如果調(diào)用失敗,fork()函數(shù)會(huì)返回-1,并設(shè)置errno來(lái)指示錯(cuò)誤類型。

1.2 函數(shù)示例

代碼示例如下:

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

int main() {
    pid_t pid = fork();
    if (pid == -1) {
        printf("Failed to fork a new process.\n");
        return 1;
    } else if (pid == 0) {
        printf("This is the child process.\n");
    } else {
        printf("This is the parent process.\n");
    }
    return 0;
}

上述代碼中,fork()系統(tǒng)調(diào)用會(huì)返回兩次,分別在父進(jìn)程和子進(jìn)程中返回。通過(guò)判斷返回值,我們可以區(qū)分父進(jìn)程和子進(jìn)程,并執(zhí)行不同的代碼邏輯。



2. 獲取進(jìn)程ID和父進(jìn)程ID

在Linux系統(tǒng)中,可以使用getpid()getppid()系統(tǒng)調(diào)用來(lái)獲取當(dāng)前進(jìn)程的ID和父進(jìn)程的ID。


2.1 函數(shù)原型和返回值

getpid()getppid()函數(shù)的原型如下:

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

pid_t getpid(void);
pid_t getppid(void);

這兩個(gè)函數(shù)都 沒(méi)有任何參數(shù) ,它們的返回值都是一個(gè)pid_t類型的整數(shù)。具體解釋如下:

  • getpid()函數(shù)返回調(diào)用進(jìn)程的進(jìn)程ID(PID)。
  • getppid()函數(shù)返回調(diào)用進(jìn)程的父進(jìn)程的進(jìn)程ID(PPID)。

2.2 函數(shù)示例

代碼示例如下:

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

int main() {
    pid_t pid = getpid();
    pid_t ppid = getppid();
    printf("Process ID: %d\n", pid);
    printf("Parent Process ID: %d\n", ppid);
    return 0;
}


3. exec函數(shù)族

在Linux系統(tǒng)中,exec()函數(shù)族可以用于將當(dāng)前進(jìn)程替換為新的程序。exec()函數(shù)族包括execl()、execv()execle()、execve()等函數(shù)。這些函數(shù)可以根據(jù)不同的參數(shù)形式來(lái)執(zhí)行不同的替換方式。


3.1 exec()函數(shù)族的常見(jiàn)成員:

  1. int execl(const char *path, const char *arg, ...);

    • 參數(shù) path 是要執(zhí)行的新程序的路徑。
    • 參數(shù) arg 是一個(gè)字符串,表示新程序的第一個(gè)參數(shù)。
    • 可變參數(shù)列表是新程序的其他參數(shù),必須以 NULL 結(jié)束。
    • 函數(shù)執(zhí)行成功時(shí)不會(huì)返回,如果返回則表示執(zhí)行失敗。

  2. int execv(const char *path, char *const argv[]);

    • 參數(shù) path 是要執(zhí)行的新程序的路徑。
    • 參數(shù) argv 是一個(gè)字符串?dāng)?shù)組,表示新程序的參數(shù)列表,最后一個(gè)元素必須是 NULL。
    • 函數(shù)執(zhí)行成功時(shí)不會(huì)返回,如果返回則表示執(zhí)行失敗。

  3. int execle(const char *path, const char *arg, ..., char *const envp[]);

    • 參數(shù) path 是要執(zhí)行的新程序的路徑。
    • 參數(shù) arg 是一個(gè)字符串,表示新程序的第一個(gè)參數(shù)。
    • 可變參數(shù)列表是新程序的其他參數(shù),必須以 NULL 結(jié)束。
    • 參數(shù) envp 是一個(gè)字符串?dāng)?shù)組,表示新程序的環(huán)境變量列表,最后一個(gè)元素必須是 NULL。
    • 函數(shù)執(zhí)行成功時(shí)不會(huì)返回,如果返回則表示執(zhí)行失敗。

  4. int execvp(const char *file, char *const argv[]);

    • 參數(shù) file 是要執(zhí)行的新程序的文件名。
    • 參數(shù) argv 是一個(gè)字符串?dāng)?shù)組,表示新程序的參數(shù)列表,最后一個(gè)元素必須是 NULL。
    • 函數(shù)執(zhí)行成功時(shí)不會(huì)返回,如果返回則表示執(zhí)行失敗。

這些函數(shù)在執(zhí)行成功時(shí)不會(huì)返回,而是直接將當(dāng)前進(jìn)程替換為新程序。如果返回,則表示執(zhí)行失敗,可以根據(jù)返回值來(lái)判斷錯(cuò)誤類型。

exec()函數(shù)族可以用于在當(dāng)前進(jìn)程中加載和執(zhí)行新程序,可以實(shí)現(xiàn)程序的動(dòng)態(tài)切換和功能擴(kuò)展。一般情況下,exec()函數(shù)族會(huì)在調(diào)用fork()函數(shù)創(chuàng)建子進(jìn)程后使用,以替換子進(jìn)程的代碼和數(shù)據(jù)。


3.2 函數(shù)示例

代碼示例如下:

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("Before exec()\n");
    execl("/bin/ls", "ls", "-l", NULL);
    printf("After exec()\n");
    return 0;
}

上述代碼中,execl()函數(shù)會(huì)將當(dāng)前進(jìn)程替換為ls -l命令。execl()函數(shù)的第一個(gè)參數(shù)是要執(zhí)行的程序路徑,后續(xù)參數(shù)是傳遞給新程序的命令行參數(shù)。



4. wait和waitpid

在Linux系統(tǒng)中,父進(jìn)程可以使用wait()waitpid()系統(tǒng)調(diào)用等待子進(jìn)程的結(jié)束。這些系統(tǒng)調(diào)用會(huì)阻塞父進(jìn)程的執(zhí)行,直到子進(jìn)程結(jié)束。


4.1 函數(shù)解釋

wait()waitpid()是用于等待子進(jìn)程結(jié)束并獲取子進(jìn)程的退出狀態(tài)的函數(shù)。

  1. pid_t wait(int *status);

    • 函數(shù)會(huì)掛起當(dāng)前進(jìn)程,直到一個(gè)子進(jìn)程結(jié)束。
    • 如果成功等到子進(jìn)程結(jié)束,函數(shù)會(huì)返回子進(jìn)程的進(jìn)程ID。
    • 參數(shù) status 是一個(gè)指向整型的指針,用于存儲(chǔ)子進(jìn)程的退出狀態(tài)信息。
    • 如果調(diào)用失敗,函數(shù)會(huì)返回-1。

  2. pid_t waitpid(pid_t pid, int *status, int options);

    • 函數(shù)會(huì)掛起當(dāng)前進(jìn)程,直到指定的子進(jìn)程結(jié)束。
    • 參數(shù) pid 指定要等待的子進(jìn)程的進(jìn)程ID。
    • 參數(shù) status 是一個(gè)指向整型的指針,用于存儲(chǔ)子進(jìn)程的退出狀態(tài)信息。
    • 參數(shù) options 是一個(gè)整型值,用于指定等待的選項(xiàng)。
    • 如果調(diào)用失敗,函數(shù)會(huì)返回-1。

wait()waitpid()函數(shù)的返回值是子進(jìn)程的進(jìn)程ID,如果調(diào)用失敗,則返回-1。通過(guò)參數(shù) status 可以獲取子進(jìn)程的退出狀態(tài)信息,包括退出碼、終止信號(hào)等。

waitpid()函數(shù)相比于wait()函數(shù)更加靈活,可以通過(guò)參數(shù) pidoptions 控制等待的子進(jìn)程。

其中,pid 的取值可以是:

  • -1:等待任意子進(jìn)程。
  • 0:等待與當(dāng)前進(jìn)程組ID相同的子進(jìn)程。
  • 具體的子進(jìn)程ID:等待指定的子進(jìn)程。

options 參數(shù)可以通過(guò)位掩碼的方式指定多個(gè)選項(xiàng),常用的選項(xiàng)有:

  • WNOHANG:非阻塞方式,如果沒(méi)有子進(jìn)程結(jié)束,立即返回。
  • WUNTRACED:也會(huì)返回已經(jīng)停止的子進(jìn)程的狀態(tài)。
  • WCONTINUED:也會(huì)返回已經(jīng)繼續(xù)運(yùn)行的子進(jìn)程的狀態(tài)。

wait()waitpid()函數(shù)可以用于處理子進(jìn)程的退出狀態(tài),釋放子進(jìn)程的資源,并進(jìn)行進(jìn)程間的同步。在使用這兩個(gè)函數(shù)時(shí),需要注意處理錯(cuò)誤情況和避免僵尸進(jìn)程的產(chǎn)生。


4.2 函數(shù)示例

代碼示例如下:

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

int main() {
    pid_t pid = fork();
    if (pid == -1) {
        printf("Failed to fork a new process.\n");
        return 1;
    } else if (pid == 0) {
        printf("This is the child process.\n");
    } else {
        wait(NULL);
        printf("This is the parent process.\n");
    }
    return 0;
}

上述代碼中,父進(jìn)程使用wait(NULL)系統(tǒng)調(diào)用等待子進(jìn)程的結(jié)束。wait()系統(tǒng)調(diào)用會(huì)阻塞父進(jìn)程的執(zhí)行,直到子進(jìn)程結(jié)束。



總結(jié)

  1. fork()函數(shù):用于創(chuàng)建子進(jìn)程,返回值不同表示在不同的進(jìn)程中執(zhí)行。
  2. exec()函數(shù)族:用于在當(dāng)前進(jìn)程中加載和執(zhí)行新程序,可以實(shí)現(xiàn)程序的動(dòng)態(tài)切換和功能擴(kuò)展。
    • execl():接受可變參數(shù)的形式,參數(shù)以字符串形式傳遞。
    • execle():接受可變參數(shù)的形式,同時(shí)傳遞環(huán)境變量。
    • execvp():接受參數(shù)數(shù)組的形式,參數(shù)以字符串?dāng)?shù)組形式傳遞。
  3. wait()waitpid()函數(shù):用于等待子進(jìn)程結(jié)束并獲取子進(jìn)程的退出狀態(tài)。
    • wait():等待任意子進(jìn)程結(jié)束。
    • waitpid():可以指定等待的子進(jìn)程。
    • 通過(guò)參數(shù) status 可以獲取子進(jìn)程的退出狀態(tài)信息。
    • 可以通過(guò) options 參數(shù)控制等待的選項(xiàng),如非阻塞方式等。
    • 需要注意處理錯(cuò)誤情況和避免僵尸進(jìn)程的產(chǎn)生。

這些函數(shù)和系統(tǒng)調(diào)用可以用于進(jìn)程的創(chuàng)建、執(zhí)行和等待,實(shí)現(xiàn)進(jìn)程間的同步和協(xié)作。通過(guò)這些函數(shù),可以實(shí)現(xiàn)進(jìn)程的動(dòng)態(tài)切換、功能擴(kuò)展和資源釋放。同時(shí),需要注意處理錯(cuò)誤情況,避免產(chǎn)生僵尸進(jìn)程和資源泄漏的問(wèn)題。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-654743.html

到了這里,關(guān)于【Linux操作系統(tǒng)】深入探索Linux進(jìn)程:創(chuàng)建、共享與管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 深入理解操作系統(tǒng)中進(jìn)程與線程的區(qū)別及切換機(jī)制(下)

    深入理解操作系統(tǒng)中進(jìn)程與線程的區(qū)別及切換機(jī)制(下)

    上一篇文章中我們了解了進(jìn)程的執(zhí)行方式,包括早期單核處理器上的順序執(zhí)行以及引入多任務(wù)概念實(shí)現(xiàn)的偽并行。我們還探討了進(jìn)程的狀態(tài)模型。進(jìn)程可以處于就緒、運(yùn)行、阻塞和結(jié)束等不同的狀態(tài)。 在本篇文章中,我將探討研究進(jìn)程的狀態(tài)模型、控制結(jié)構(gòu)和切換機(jī)制。希望

    2024年02月11日
    瀏覽(18)
  • 頭歌操作系統(tǒng)-課堂練習(xí)3.2:進(jìn)程的創(chuàng)建

    頭歌操作系統(tǒng)-課堂練習(xí)3.2:進(jìn)程的創(chuàng)建

    第1關(guān):進(jìn)程創(chuàng)建前后TR寄存器值的分析 編程要求 根據(jù)相關(guān)知識(shí),回答問(wèn)題: (將答案填寫在 /data/workspace/myshixun/第一關(guān).txt 中) 0 號(hào)進(jìn)程的 fork 系統(tǒng)調(diào)用(main.c:147)中的陷入指令的地址是多少? 0 號(hào)進(jìn)程執(zhí)行 fork 系統(tǒng)調(diào)用之前,TR 寄存器的值為多少? 0 號(hào)進(jìn)程剛執(zhí)行完 for

    2023年04月26日
    瀏覽(166)
  • 頭歌操作系統(tǒng) 課堂練習(xí)3.2:進(jìn)程的創(chuàng)建

    頭歌操作系統(tǒng) 課堂練習(xí)3.2:進(jìn)程的創(chuàng)建

    本實(shí)訓(xùn)需要設(shè)置內(nèi)核版本 1 為調(diào)試分析的對(duì)象,用 gdb 調(diào)試內(nèi)核,內(nèi)核版本 1 的壓縮文件存放在 /data/workspace/myshixun/exp1 中。 環(huán)境配置詳情請(qǐng)移步前幾關(guān)~頭歌操作系統(tǒng) 課后作業(yè)3.1:進(jìn)程的描述與狀態(tài) 編程要求 根據(jù)相關(guān)知識(shí),回答問(wèn)題: (將答案填寫在 /data/workspace/myshixun/第

    2024年02月04日
    瀏覽(66)
  • Linux操作系統(tǒng)篇:進(jìn)程

    Linux操作系統(tǒng)篇:進(jìn)程

    我們常見(jiàn)的計(jì)算機(jī),如筆記本。我們不常見(jiàn)的計(jì)算機(jī),如服務(wù)器,大部分都遵守馮諾依曼體系 為什么計(jì)算機(jī)要采用馮諾依曼體系呢? 在計(jì)算機(jī)出現(xiàn)之前有很多人都提出過(guò)計(jì)算機(jī)體系結(jié)構(gòu),但最終選擇馮諾依曼是因?yàn)橛帽容^少的錢就可以做出效率不錯(cuò)的計(jì)算機(jī) 截至目前,我們

    2024年03月18日
    瀏覽(44)
  • 【Linux】操作系統(tǒng)&&進(jìn)程概念

    【Linux】操作系統(tǒng)&&進(jìn)程概念

    馮·諾依曼結(jié)構(gòu)也稱普林斯頓結(jié)構(gòu),是一種將程序指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器合并在一起的存儲(chǔ)器結(jié)構(gòu) 。數(shù)學(xué)家馮·諾依曼提出了計(jì)算機(jī)制造的三個(gè)基本原則,即采用二進(jìn)制邏輯、程序存儲(chǔ)執(zhí)行以及計(jì)算機(jī)由五個(gè)部分組成( 運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)備、輸出設(shè)備 ),這

    2024年01月16日
    瀏覽(25)
  • Linux--操作系統(tǒng)進(jìn)程的狀態(tài)

    Linux--操作系統(tǒng)進(jìn)程的狀態(tài)

    【Linux】進(jìn)程概念 —— 進(jìn)程狀態(tài)_linux d狀態(tài)進(jìn)程_Hello_World_213的博客-CSDN博客 新建: 字面意思,將你的task_struct創(chuàng)建出來(lái)并且還未入隊(duì)列 運(yùn)行: task_struct結(jié)構(gòu)體在運(yùn)行隊(duì)列中排隊(duì),就叫做運(yùn)行態(tài) 阻塞: 等待非CPU資源就緒,阻塞狀態(tài) ? 掛起: 當(dāng)內(nèi)存不足的時(shí)候,OS通過(guò)適當(dāng)?shù)?/p>

    2024年02月15日
    瀏覽(30)
  • 【Linux】操作系統(tǒng)與進(jìn)程的概念

    【Linux】操作系統(tǒng)與進(jìn)程的概念

    目錄 馮諾依曼體系 注意 為什么CPU不直接訪問(wèn)輸入或輸出設(shè)備? 跨主機(jī)間數(shù)據(jù)的傳遞 操作系統(tǒng) 管理 進(jìn)程 描述進(jìn)程 進(jìn)程的查看和終止 ?bash 通過(guò)系統(tǒng)調(diào)用創(chuàng)建子進(jìn)程 fork的辨析 ??馮·諾依曼結(jié)構(gòu)也稱普林斯頓結(jié)構(gòu),是一種 將程序指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器合并在一起的存儲(chǔ)器

    2024年01月18日
    瀏覽(21)
  • Linux操作系統(tǒng)——第五章 進(jìn)程信號(hào)

    Linux操作系統(tǒng)——第五章 進(jìn)程信號(hào)

    ? ? ? 目錄 信號(hào)概念 用kill -l命令可以察看系統(tǒng)定義的信號(hào)列表 信號(hào)處理常見(jiàn)方式概覽 產(chǎn)生信號(hào) 1. 通過(guò)終端按鍵產(chǎn)生信號(hào) 2. 調(diào)用系統(tǒng)函數(shù)向進(jìn)程發(fā)信號(hào) 3. 由軟件條件產(chǎn)生信號(hào) 4. 硬件異常產(chǎn)生信號(hào) 阻塞信號(hào) 1. 信號(hào)其他相關(guān)常見(jiàn)概念 2. 在內(nèi)核中的表示 3. sigset_t 4. 信號(hào)集操作

    2024年02月11日
    瀏覽(24)
  • 操作系統(tǒng)課程設(shè)計(jì)-Linux 進(jìn)程控制

    操作系統(tǒng)課程設(shè)計(jì)-Linux 進(jìn)程控制

    目錄 前言 1 實(shí)驗(yàn)題目 2 實(shí)驗(yàn)?zāi)康?3 實(shí)驗(yàn)內(nèi)容 3.1 進(jìn)程的創(chuàng)建 3.1.1 步驟 3.1.2 關(guān)鍵代碼 3.2 子進(jìn)程執(zhí)行新任務(wù) 3.2.1 步驟 3.2.2?關(guān)鍵代碼 4 實(shí)驗(yàn)結(jié)果與分析 4.1 進(jìn)程的創(chuàng)建 4.2 子進(jìn)程執(zhí)行新任務(wù) 5 代碼 5.1 進(jìn)程的創(chuàng)建 5.2 子進(jìn)程執(zhí)行新任務(wù) ?????????本實(shí)驗(yàn)為課設(shè)內(nèi)容,博客內(nèi)容為

    2024年01月18日
    瀏覽(28)
  • 【Linux】進(jìn)程概念(馮諾依曼體系結(jié)構(gòu)、操作系統(tǒng)、進(jìn)程)-- 詳解

    【Linux】進(jìn)程概念(馮諾依曼體系結(jié)構(gòu)、操作系統(tǒng)、進(jìn)程)-- 詳解

    1、概念 (1)什么是馮諾伊曼體系結(jié)構(gòu)? 數(shù)學(xué)家馮·諾伊曼于 1946 年提出存儲(chǔ)程序原理,把程序本身當(dāng)作數(shù)據(jù)來(lái)對(duì)待,程序和該程序處理的數(shù)據(jù)用同樣的方式儲(chǔ)存。 馮·諾伊曼理論的要點(diǎn)是:計(jì)算機(jī)的數(shù)制采用二進(jìn)制邏輯;計(jì)算機(jī)應(yīng)該按照程序順序執(zhí)行。人們把馮·諾伊曼的

    2024年02月22日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包