ps命令查看系統進程、exec替換進程、fork創建子進程


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 }

 

執行結果:

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM