Linux進程管理之如何創(chuàng)建和銷毀進程
Linux是一個多任務操作系統(tǒng),進程管理是其核心功能之一。
本文將詳細介紹如何在Linux中創(chuàng)建和銷毀進程,包括示例代碼和詳細說明。
創(chuàng)建進程
在Linux中,可以使用多種方法創(chuàng)建新的進程。
以下是幾種常見的方法:
1. 使用fork()系統(tǒng)調(diào)用
fork()
系統(tǒng)調(diào)用是創(chuàng)建新進程的最常見方式。
它會創(chuàng)建一個與父進程幾乎完全相同的子進程。
#include <stdio.h> #include <unistd.h> int main() { pid_t child_pid; child_pid = fork(); if (child_pid == 0) { // 子進程代碼 printf("This is the child process\n"); } else if (child_pid > 0) { // 父進程代碼 printf("This is the parent process, child PID: %d\n", child_pid); } else { // 創(chuàng)建進程失敗 perror("fork"); return 1; } return 0; }
2. 使用exec()系列函數(shù)
exec()
系列函數(shù)用于在當前進程中執(zhí)行一個新的程序。
它們通常與fork()
一起使用,以替換子進程的內(nèi)存映像。
#include <stdio.h> #include <unistd.h> int main() { pid_t child_pid; child_pid = fork(); if (child_pid == 0) { // 子進程代碼 printf("This is the child process\n"); // 在子進程中執(zhí)行新程序 execl("/bin/ls", "ls", "-l", NULL); } else if (child_pid > 0) { // 父進程代碼 printf("This is the parent process, child PID: %d\n", child_pid); } else { // 創(chuàng)建進程失敗 perror("fork"); return 1; } return 0; }
3. 使用系統(tǒng)調(diào)用clone()
clone()
系統(tǒng)調(diào)用與fork()
類似,但它允許更精細的控制,例如共享文件描述符和內(nèi)存空間。
#define _GNU_SOURCE #include <stdio.h> #include <sched.h> #include <stdlib.h> #include <unistd.h> int child_function(void *arg) { printf("This is the child process\n"); return 0; } int main() { char *stack; char *stack_top; pid_t child_pid; stack = (char *)malloc(8192); if (stack == NULL) { perror("malloc"); return 1; } stack_top = stack + 8192; child_pid = clone(child_function, stack_top, CLONE_VM | CLONE_FS | CLONE_FILES, NULL); if (child_pid == -1) { perror("clone"); return 1; } printf("This is the parent process, child PID: %d\n", child_pid); return 0; }
銷毀進程
Linux中,有幾種方法可以銷毀進程,其中最常見的是使用exit()
系統(tǒng)調(diào)用。
以下是一個示例:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t child_pid; child_pid = fork(); if (child_pid == 0) { // 子進程代碼 printf("This is the child process\n"); // 子進程退出 exit(0); } else if (child_pid > 0) { // 父進程代碼 printf("This is the parent process, child PID: %d\n", child_pid); // 等待子進程退出 wait(NULL); printf("Child process has exited\n"); } else { // 創(chuàng)建進程失敗 perror("fork"); return 1; } return 0; }
進程組與會話
在Linux中,進程組和會話是進程管理的重要概念。進程組是一組相關聯(lián)的進程的集合,而會話則是一組進程組的集合。
進程組通常用于將多個相關的進程組織在一起,以便更好地進行控制和信號處理。
以下是創(chuàng)建進程組和會話的示例:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t child_pid; child_pid = fork(); if (child_pid == 0) { // 子進程代碼 printf("This is the child process (PID: %d)\n", getpid()); // 創(chuàng)建一個新會話并成為會話領袖 if (setsid() == -1) { perror("setsid"); return 1; } // 創(chuàng)建一個新進程組 if (setpgid(0, 0) == -1) { perror("setpgid"); return 1; } printf("Child process is in a new session and process group\n"); sleep(10); // 保持進程運行10秒 } else if (child_pid > 0) { // 父進程代碼 printf("This is the parent process, child PID: %d\n", child_pid); // 等待子進程退出 wait(NULL); printf("Child process has exited\n"); } else { // 創(chuàng)建進程失敗 perror("fork"); return 1; } return 0; }
在上述示例中,子進程首先創(chuàng)建了一個新會話并成為會話領袖,然后創(chuàng)建了一個新進程組。
這將導致子進程脫離父進程的控制終端和進程組,成為一個獨立的會話。這對于守護進程等后臺任務非常有用。
殺死進程
在Linux中,可以使用kill
命令或kill()
系統(tǒng)調(diào)用來殺死進程。
以下是一個示例:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void sig_handler(int signo) { if (signo == SIGTERM) { printf("Received SIGTERM, exiting...\n"); exit(0); } } int main() { pid_t child_pid; child_pid = fork(); if (child_pid == 0) { // 子進程代碼 printf("This is the child process (PID: %d)\n", getpid()); // 注冊信號處理函數(shù) signal(SIGTERM, sig_handler); while (1) { // 子進程持續(xù)運行 sleep(1); } } else if (child_pid > 0) { // 父進程代碼 printf("This is the parent process, child PID: %d\n", child_pid); // 等待一段時間后向子進程發(fā)送SIGTERM信號 sleep(5); kill(child_pid, SIGTERM); printf("Sent SIGTERM to child process\n"); // 等待子進程退出 wait(NULL); printf("Child process has exited\n"); } else { // 創(chuàng)建進程失敗 perror("fork"); return 1; } return 0; }
在上述示例中,父進程通過kill()
系統(tǒng)調(diào)用向子進程發(fā)送SIGTERM
信號,以請求子進程優(yōu)雅地退出。
總結
Linux進程管理是操作系統(tǒng)的核心功能之一,對于系統(tǒng)開發(fā)和管理人員來說是重要的知識點。
本文詳細介紹了如何創(chuàng)建和銷毀進程,以及如何使用進程組和會話來組織進程。此外,還介紹了如何殺死進程。
希望本文提供的示例代碼和詳細說明有助于大家更好地理解和應用Linux進程管理的概念和技巧。也希望大家多多支持腳本之家。
相關文章
linux下查看內(nèi)存條數(shù)及每根內(nèi)存大小的實現(xiàn)方法(推薦)
下面小編就為大家?guī)硪黄猯inux下查看內(nèi)存條數(shù)及每根內(nèi)存大小的實現(xiàn)方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11從Linux源碼看Socket(TCP)Client端的Connect的示例詳解
這篇文章主要介紹了從Linux源碼看Socket(TCP)Client端的Connect,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07ubuntu 16.04LTS 開機啟動自動更換壁紙的實現(xiàn)方法
下面小編就為大家分享一篇ubuntu 16.04LTS 開機啟動自動更換壁紙的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02You don’t have permission to access /index.php on.
運行php時提示You don't have permission to access /index.php on.錯誤的解決方法,需要的朋友可以參考下2013-02-02