在linux編譯理解進程

首先編程;

代碼來自https://blog.csdn.net/lindsay_bubble/article/details/55274888
多進程併發執行程序。父進程首先創建一個執行 ls 命令的子進程然後該子進程再創建一個執行 ps 命令的子進程,並控制ps 命令總在 ls 命令之前執行。

/*
* Filename
: pctl.c
* 
: (C) 2015 by 孫銘超
* Function
: 編寫一個多進程併發執行程序。父進
 程首先創建一個執行 ls 命令的子進程然後再創建一個執行 ps 命令的子進程,
 並控制ps 命令總在 ls 命令之前執行。
*/
#include <sys/types.h>
#include <wait.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc)
{
 
int i;
 
int pid_ls;//存放執行ls命令子進程號
 
int pid_ps;//存放執行PS命令子進程號
 
int status_ls; //存放ls子進程返回狀態
 
int status_ps; //存放ps子進程返回狀態
 
char *args_ls[] = {"/bin/ls","-a",NULL}; //子進程要缺省執行的命令ls
 
char *args_ps[] = {"/bin/ps","-l",NULL}; //子進程要缺省執行的命令ps
 
pid_ls=fork() ; //建立ls子進程
 
if(pid_ls<0) // 建立ls子進程失敗
{
 
printf("Create Process(ls) fail!\n");
exit(EXIT_FAILURE);
 
}
 
 
if(pid_ls == 0) // ls子進程執行代碼段
{
//報告父子進程進程號
printf("I am Child process %d\nMy father is %d\n",getpid(),getppid());
 
//創建ps子進程
pid_ps=fork() ;
 
if(pid_ps<0) // 建立ps子進程失敗
{
printf("Create Process(s) fail!\n");
exit(EXIT_FAILURE);
}
if(pid_ps == 0) // ps子進程執行代碼段
{
//報告父子進程進程號
printf("I am Child process %d\nMy father is %d\n",getpid(),getppid());
 
//子進程執行ps
printf("%d child_ps will Running: \n",getpid());
 
//則執行缺省的命令ps
for(i=0; args_ps[i] != NULL; i++) printf("%s ",args_ps[i]);
printf("\n");
//裝入並執行新的程序
status_ps = execve(args_ps[0],args_ps,NULL);
 
}else{
 
//父進程等待子進程執行結束
printf("%d Waiting for child done.\n\n",pid_ps);
waitpid(pid_ps,&status_ps,0); //等待子進程結束
printf("\nMy child exit! status = %d\n\n",status_ps);
 
}
//子進程執行ls
printf("%d child_ls will Running: \n",getpid()); //
 
//則執行缺省的命令ls
for(i=0; args_ls[i] != NULL; i++) printf("%s ",args_ls[i]);
printf("\n");
//裝入並執行新的程序
status_ls = execve(args_ls[0],args_ls,NULL);
}
 
else //父進程執行代碼段
{
printf("\nI am Parent process %d\n",getpid()); //報告父進程進程號
 
sleep(1) ; //等待子進程建立
 
//與子進程併發執行不等待子進程執行結束,
 
printf("%d don't Wait for child(ls) done.\n\n",getpid());
}
 
return EXIT_SUCCESS;
}

作爲一個啥也不瞭解弱雞,一開始不知道怎麼編譯,用普通編譯器。其實不用,用終端編譯就可以了。怎麼編譯呢?
選擇一個目錄(cd 目錄)隨便哪都可以或者可以省略這一步那麼文件在主目錄
1.gedit 名字.c(創建一個文件)
2.在文檔中寫c程序
3.在終端中,輸入以下命令以生成您編寫的程序的可執行版本:
gcc 名字.c -o 名字
4../名字
名字是你的程序文件名。然後就可以成功運行
(原作者的頭文件裏面有空格,我會說我開始沒注意到發現頭文件找不到然後百度了好幾個小時嗎)

理解代碼:慢慢看也不難

涉及命令。

管理命令:代碼

中命令
來着https://blog.csdn.net/a568713197/article/details/86982061
ps:觀察某個時刻進程運作狀態
只查閱自己bash進程的:ps -l 在這裏插入圖片描述
F:代表這個進程旗標(process flags)說明這個進程的總結權限
4表示此進程的權限爲root
1表示此子進程僅進行復制(fork)而沒有實際執行(exce)

S:代表這個進程的狀態
在這裏插入圖片描述
UID、PID、PPID:擁有者ID、進程ID、父進程ID

C:CPU使用率,單位爲百分比

PRI、NI:priority、nice的縮寫,代表被CPU執行的優先級,數值越小代表該進程越快被CPU執行

ADDR、SZ、WCHAN:都與內存有關,ADDR是kernel function,指出該進程在內存的哪個部分,如果是個running的進程,一般顯示 - ;SZ表示此進程用掉了多少內存,WCHAN表示目前進程是否在運作中, - 表示正在運作

TTY:登入者的終端機位置,若爲遠程登錄則使用動態終端接口(pts/n);

TIME:使用掉的COU時間

CMD:造成此進程觸發的指令

查閱所有系統運作的進程:ps aux
在這裏插入圖片描述
在這裏插入圖片描述

ps -lA 也比較常用

ps axjf列出類似進程樹的進程顯示,也可以使用pstree

殭屍進程
該進程應該已經執行完畢,或者因故應該要終止了,但是該進程的父進程卻無法完整的將該進程結束掉,而造成那個進程一直存在內存當中

當CMD後面還接上代表該進程是殭屍進程
ls命令用來列出目標目錄
ls命令用來列出目標目錄(缺省的話爲當前目錄)中所有的子目錄和文件。
-a顯示指定目錄(缺省爲當前目錄)下所有文件,包括隱藏文件與目錄
更多查看這裏https://www.cnblogs.com/kerrycode/p/6741200.html
top:動態觀察進程的變化
將top的輸出重定向到文件:top -b -n 2 > /tmp/top.txt在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章