???文章的目的為了記錄使用C語言進行linux?開發學習的經歷。開發流程和要點有些記憶模糊,趕緊記錄,防止忘記。
相關鏈接:
linux C 語言開發 (一) Window下用gcc編譯和gdb調試
linux C 語言開發 (二) VsCode遠程開發 linux
linux C 語言開發 (三) 建立云服務器
linux C 語言開發 (四) linux系統常用命令
linux C 語言開發 (五) linux系統目錄結構
linux C 語言開發 (六) 程序的編輯和編譯(vim、gcc)
linux C 語言開發 (七) 文件 IO 和標準 IO
linux C 語言開發 (八) 進程基礎
linux C 語言開發 (九) 進程間通訊--管道
linux C 語言開發 (十) 進程間通訊--信號
Linux C到Android App開發推薦鏈接(入門十二章):
開源 java android app 開發(一)開發環境的搭建_csdn 開源 java android app-CSDN博客
開源 java android app 開發(一)開發環境的搭建-CSDN博客
開源 java android app 開發(二)工程文件結構-CSDN博客
開源 java android app 開發(三)GUI界面布局和常用組件-CSDN博客
開源 java android app 開發(四)GUI界面重要組件-CSDN博客
開源 java android app 開發(五)文件和數據庫存儲-CSDN博客
開源 java android app 開發(六)多媒體使用-CSDN博客
開源 java android app 開發(七)通訊之Tcp和Http-CSDN博客
開源 java android app 開發(八)通訊之Mqtt和Ble-CSDN博客
開源 java android app 開發(九)后臺之線程和服務-CSDN博客
開源 java android app 開發(十)廣播機制-CSDN博客
開源 java android app 開發(十一)調試、發布-CSDN博客
開源 java android app 開發(十二)封庫.aar-CSDN博客
linux C到.net mvc開發推薦鏈接:
開源C# .net mvc 開發(一)WEB搭建_c#部署web程序-CSDN博客
開源 C# .net mvc 開發(二)網站快速搭建_c#網站開發-CSDN博客
開源 C# .net mvc 開發(三)WEB內外網訪問(VS發布、IIS配置網站、花生殼外網穿刺訪問)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客
開源 C# .net mvc 開發(四)工程結構、頁面提交以及顯示_c#工程結構-CSDN博客
開源 C# .net mvc 開發(五)常用代碼快速開發_c# mvc開發-CSDN博客、
內容:講述進程的基礎知識,進程就是正在運行的程序。講述如何創建,運行種類等。
目錄:
1.創建
2.執行
3.命令
4.種類
一、創建
????????所有的進程都是由其他進程創建(除了 pid 為 0 號的 idle 進程) , pid 號為 1 的 init 進程是系統啟動后運行的第一個進程, 是所有進程的父進程, init 進程會初始化一部分系統服務, 創建其他進程。
????????創建新進程的那個進程稱為父進程, 新進程稱為子進程, 父進程和子進程擁有相同的代碼段數據段,有各自獨立的地址空間。 采用寫時拷貝技術, 即創建的新進程不會立即把父進程的資源空間復制過來, 只有在修改時才會復制資源, 另外父進程掛起的信號和文件鎖不會被子進程繼承。
????????子進程結束后, 它的父進程要回收它的資源, 否則就會成為僵尸進程 。
????????如果父進程先結束, 子進程會被 init 進程收養, 稱為孤兒進程
頭文件 | #include <sys/types.h> #include <unistd.h> |
函數 | pid_t getpid(void); |
返回值 | PID 號 |
功能 | 獲取此進程 PID |
頭文件 | #include <sys/types.h> #include <unistd.h> |
函數 | pid_t getppid(void); |
返回值 | PID 號 |
功能 | 獲取父進程 PID |
頭文件 | #include <unistd.h> |
函數 | pid_t fork(void); |
返回值 | 調用成功父進程返回子進程號, 子進程返回 0, 失敗返回-1。 |
功能 | 系統調用, 創建一個進程 |
#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid < 0)
{
printf("fork is error \n");
return -1;
}
//父進程
if (pid > 0)
{
printf("This is parent,parent pid is %d\n", getpid());
}
//子進程
if (pid == 0)
{
printf("This is child,child pid is %d,parent pid is %d\n", getpid(), get
ppid());
}
return 0;
}
執行后的效果
二、執行
用 fork 函數創建子進程后, 子進程往往要調用一種 exec 函數以執行另一個程序, 該子進程被新的程序替換, 改變地址空間, 進程映像和一些屬性, 但是 pid 號不變。
函數 | int execve(const char *filename, char *const argv[], char *const envp[]); |
頭文件 | #include <unistd.h> |
參數 filename | 路徑名, 表示載入進程空間的新程序路徑。 |
參數 argv[] | 命令行參數, argv[0]為命令名 |
參數 envp[] | 新程序的環境變量 |
返回值 | 成功時不會返回, 使用時不用檢查返回值, 可通過 errno 檢查。 |
以下函數都是根據 execve 實現:
int execl(const char *path, const char *arg, .../* (char *) NULL */);
int execlp(const char *file, const char *arg, .../* (char *) NULL */);
int execle(const char *path, const char *arg, .../*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);
演示代碼
執行execl,創建execl_sub
execl代碼
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
int i=0;
pid_t pid;
pid = fork();
if (pid < 0)
{
printf("fork is error \n");
return -1;
} /
/父進程
if (pid > 0)
{
printf("This is parent,parent pid is %d\n", getpid());
} /
/子進程
if (pid == 0)
{
printf("This is child,child pid is %d\n", getpid(), getppid());
//改為自己的路徑
execl("/home/samba/linux/15/hello","hello",NULL);
exit(1);
} i
++;
printf("i is %d\n",i);
return 0;
}
execl_sub代碼
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("hello world\n");
return 0;
}
演示效果
三、命令
進程常用命令為ps和kill
ps 命令: ps 命令可以列出系統中當前運行的那些進程。
命令格式: ps [參數]
命令功能: 用來顯示當前進程的狀態常用參數: aux
kill 命令: kill 命令用來殺死進程舉例: kill -9(SIGKILL) PID
進程的狀態
D: 無法中斷的休眠狀態 (通常 IO 的進程)
R: 正在執行中
S: 靜止狀態
T: 暫停執行
Z: 不存在但暫時無法消除
W: 沒有足夠的記憶體分頁可分配
<: 高優先序的行程
N: 低優先序的行程
L: 有記憶體分頁分配并鎖在記憶體內 (實時系統或捱 A I/O)
顯示所有進程
ps -aux
查找進程
ps aux | grep test
殺死進程
kill -9(SIGKILL) PID
四、種類
孤兒進程: 父進程結束以后, 子進程還未結束, 這個子進程就叫做孤兒進程。
僵尸進程: 子進程結束以后, 父進程還在運行, 但是父進程不去釋放進程控制塊, 這個子進程就叫做僵尸進程。
守護進程(daemon)是一類在后臺運行的特殊進程, 用于執行特定的系統任務。 很多守護進程在系統引導的時候啟動, 并且一直運行直到系統關閉。 另一些只在需要的時候才啟動, 完成任務后就自動結束
?
要防止僵尸進程可以使用wait函數
wait()函數一般用在父進程中等待回收子進程的資源, 而防止僵尸進程的產生
函數 | pid_t wait(int *status) |
頭文件 | #include <sys/wait.h> |
返回值 | 成功返回回收的子進程的 pid, 失敗返回-1 |