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