1、使用ps命令查看系統正在運行的進程
ps --help:查看ps的參數。
ps -aux:表示顯示包含其他使用者的進程。
USER:進程擁有者
PID:進程ID
%CPU:CPU占用率
%MEM:內存占用率
TIME:進程目前為止所占用的CPU時間
COMMAND:啟動進程所使用的命令
STAT:進程的狀態。S靜止狀態;s包含子進程;+位於后台的進程組;
R正在運行;S處於休眠;D不可中斷;T停止或被追蹤;Z僵屍進程。。。
ps -ef:可以查看PPID,PPID表示進程的父進程ID。
2、使用exec系列函數替換進程映像
引用庫:include<unistd.h>
exec可以把當前進程替換為一個新進程,新進程由path或file參數指定。使用exec函數將程序的執行從一個程序切換到另一個程序,新的程序啟動后,原來的程序就不再運行了。一般結合fork使用。
int exec(const *path,const char *arg0,....,(char*)0);
int execlp(const *file,const char *arg0,....,(char*)0);
....
---函數名字包含“p”的:接受程序名作為參數,在當前執行路徑中按程序名查找,不包含字母“p”的,必須提供程序的完整路徑。
---函數名字包含“v”的:接受以NULL結尾的字符串數組格式的參數列表。
---函數名字包含“l"的:接受C格式的可變參數列表。
---函數名字包含“e”的:接受一個附加的環境參數列表,參數格式為NULL結尾的字符串,且字符串的格式為“VARIABLE=value”
eg:
1 #include<unistd.h> 2 #include<stdio.h> 3 #include<stdlib.h> 4 int main(){ 5 printf("Running ps with execlp \n"); 6 execlp("ps","ps","-aux",NULL); 7 printf("Done.\n"); 8 exit(0); 9 }
輸入g++ execlp.cc -o execlp編譯程序(安裝g++,請翻看往期博客)
若編譯成功,輸入 ./execlp 執行程序
執行結果:
程序首先打印出它的第一條信息 Running ps with execlp。 接着調用 execlp,這個函數搜索程序 ps,然后用 ps 程序替換當前程序,就好像直接使 用 shell 命令 “ps -aux”一樣。所以接下來輸出執行 ps –aux 的結果--進程信息列表。 按程序的流程,執行完 execlp 后,本該執行 printf 語句輸出 Done. 但從實驗結果看程序 並沒有輸出 Done。這是為什么呢?因為前一句的 execlp 函數已經用 ps 程序代替當前的 exec.cc 程序,將進程改成執行 ps 程序了,所以進程結束后不會輸出 Done。
eg:切換到自定義程序:
execlp("/home/cly01/公共的/project/program2","./program2",NULL);
3、fork創建子進程
fork()是一個系統調用,用來創建一個新進程。 與exec相比較, fork會創建一個新進程,就像孫悟空拔毫毛變成一個新的孫悟空一樣。 而 exec 並沒有創建新進程,只是讓當前進程執行另外一個程序。
下面程序就是結合execlp()和fork():創建新進程,子進程中執行另一程序。exec_fork.cpp:
1 #include<stdio.h> 2 #include<unistd.h> 3 #include<stdlib.h> 4 #include<sys/types.h> 5 int main(){ 6 printf("-----------------program1_begin------------------\n"); 7 pid_t id=fork(); 8 switch(id){ 9 case -1: 10 printf("fork failed"); 11 exit(EXIT_FAILURE); 12 break; 13 case 0: 14 execlp("/home/cly01/公共的/project/program2","./program2",NULL); 15 break; 16 default: 17 printf("This is program111 !\n"); 18 break; 19 } 20 printf("process1 of program1 is %d \n ",getpid()); 21 sleep(2); 22 printf("-----------------program1_end------------------\n"); 23 sleep(2); 24 return 0; 25 }
id=0:在子進程中,pid 變量保存的 fork( )返回值為 0,表示當前進程是子進程。
id>0:在父進程中,pid 變量保存的 fork( )返回值為子進程的 id 值(進程唯一標識符)
id-1:創建失敗
getpid() 獲得當前進程的id;
getppid() 獲得當前進程的父進程id。
execlp()的第一個參數是程序2的完整路徑,第二的參數是 ./程序名 ,第三個參數是NULL(結束參數的輸入)
program2.cpp(執行的時候,記得編譯程序成可執行程序):
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<unistd.h> 4 int main(){ 5 printf("-----------------program2_begin------------------\n"); 6 printf("This is program222 !\n"); 7 printf("process2 of program2 is %d \n ",getpid()); 8 sleep(2); 9 printf("-----------------program2_end------------------\n"); 10 sleep(2); 11 return 0; 12 }
執行結果: