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 }
执行结果: