【Linux】孤儿进程

您所在的位置:网站首页 linux动态查看进程命令代码 【Linux】孤儿进程

【Linux】孤儿进程

#【Linux】孤儿进程 | 来源: 网络整理| 查看: 265

@TOC

1. 孤儿进程

如果父进程一直存在,子进程先退出了,父进程对子进程退出不管不顾,会出现什么样问题么?

创建makefile并输入以下内容

mytest:test.c 2 gcc -o $@ $^ 3 .PHONY:clean 4 clean: 5 rm -f mytest 复制代码

mytest 属于 目标文件 test.c 属于 依赖文件列表 @代表目标文件@代表目标文件 @代表目标文件^ 代表依赖文件列表

创建test.c并输入以下内容

#include 2 #include 3 int main() 4 { 5 pid_t id=fork(); 6 if(id==0) 7 { 8 //子进程 9 while(1) 10 { 11 printf("我是子进程,我的pid是:%d,我的ppid是%d",getpid(),getppid()); 12 sleep(1); 13 } 14 15 } 16 else if(id>0) 17 { 18 //父进程 19 int count=0;//父进程只运行10次 20 while(1) 21 { 22 printf("我是父进程,我的pid是:%d,我的ppid是%d",getpid(),getppid()); 23 sleep(1); 24 if(count--./mytest [yzq@VM-8-8-centos my]$ ./mytest -a argv[0]->./mytest argv[1]->-a [yzq@VM-8-8-centos my]$ ./mytest -a -b argv[0]->./mytest argv[1]->-a argv[2]->-b 复制代码

./mytest -a -b,就是一个字符串 以空格作为分隔符,形成一个一个的子串 第一个./mytest为可执行程序,剩余的统称为参数选项

理解命令行参数

修改test.c文件

#include 2 #include 3 #include 4 #include 5 void usage(const char*name) 6 { 7 printf("\nusage:%s-[a|b|c]\n\n",name); 8 exit(0);//终止进程 9 } 10 int main (int argc,char*argv[]) 11 { 12 if(argc!=2) 13 { 14 usage(argv[0]);//argv[0]代表可执行程序 } } 15 if(strcmp(argv[1],"-a")==0) 16 { 17 printf("打印目录下的文件名\n"); 18 } 19 else if(strcmp(argv[1],"-b")==0) 20 { 21 printf("打印目录下的文件的详细信息\n"); 22 } 23 else if(strcmp(argv[1],"-c")==0) 24 { 25 printf("打印目录下文件的隐藏信息\n"); 26 } 27 else 28 { 29 printf("待未开发\\n"); 30 } 31 32 } 复制代码

使用 make ,./mytest 执行可执行程序

[yzq@VM-8-8-centos my]$ ./mytest usage:./mytest-[a|b|c] [yzq@VM-8-8-centos my]$ ./mytest -a 打印目录下的文件名 [yzq@VM-8-8-centos my]$ ./mytest -b 打印目录下的文件的详细信息 [yzq@VM-8-8-centos my]$ ./mytest -c 打印目录下文件的隐藏信息 [yzq@VM-8-8-centos my]$ ./mytest -d 待未开发 复制代码

相当于使用ls 、ls -l 、ls -la 指令,选项以字符串形式以命令行参数传递给了程序,程序内部对选项做判断,就可使同样的ls ,携带不同的选项,就可表现不同的现象

4. 进程优先级 优先级与权限的区分

权限代表能不能的问题,优先级代表已经能,谁先谁后的问题 比如 权限:若你考完试,你能够自己去老师教室翻阅自己的卷子么,当然不能,没有权限 优先级:若你在食堂排队,你可以打饭,但是有先后顺序

为什么会有优先级? CPU资源有限,一般来说,一个电脑中CPU有一个或者两个,但是进程却有很多个,以少量的资源来应对多量的进程,势必就会存在多进程竞争资源的情况,只要竞争就要确认谁先谁后,确认优先级 查看系统进程的优先级

ps -l 查看当前系统的进程优先级

[yzq@VM-8-8-centos my]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 R 1002 3722 17835 0 80 0 - 38324 - pts/0 00:00:00 ps 0 S 1002 17835 17834 0 80 0 - 29280 do_wai pts/0 00:00:00 bash 复制代码

PRI代表当前进程的优先级 NI代表当前进程优先级的修正数据 UID代表当前用户的身份标识

PRI数字值越小,优先级越高 PRI(new)=PRI(old)+NI(nice) 一般调整的是nice值,nice值取值范围是[-20-19] 调度器的作用是一碗水端平,让每一个进程有享有资源,所以不支持将一个进程的PRI调整过小,从而导致优先级过高

调整进程优先级

在test.c中修改为以下内容

#include 2 #include 3 int main() 4 { 5 while(1) 6 { 7 printf("."); 8 fflush(stdout);//刷新缓冲区 9 sleep(1); 10 } 11 return 0; 12 } 复制代码

使用./mytest运行程序,并复制SSH渠道 创建终端2

在保证终端1mytest运行的情况下,在终端2中使用 ps -la ,找到mytest进程

[yzq@VM-8-8-centos my]$ ps -la F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1002 8561 17835 0 80 0 - 1054 hrtime pts/0 00:00:00 mytest 0 R 1002 9135 23362 0 80 0 - 38332 - pts/1 00:00:00 ps 复制代码

再次在终端2中使用 top 指令,输入 r(renice),出现如下数据

PID to renice [default pid = 7429] 复制代码

在上一步输入的 ps -la指令中查询mytest的PID

在这里插入图片描述

使用q退出 再次输入 ps -la指令

[yzq@VM-8-8-centos my]$ ps -la F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1002 8561 17835 0 90 10 - 1054 hrtime pts/0 00:00:00 mytest 0 R 1002 12141 23362 0 80 0 - 38332 - pts/1 00:00:00 ps 复制代码

发现刚刚修改nice值为10 ,PID值变为90

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3