简单的七个测试认识linux进程
Test1:linux进程创建
运行代码及结果见下图3-1、3-2。
图 3-1 运行代码
图 3-2 运行结果
从结果可以看出,系统分配的进程号PID为3345,父进程PPID为3250,用的函数为getpid(),getppid()。成功执行。
Test2:创建一个新进程,新进程的进程号和原程序的进程号相同
运行代码及结果见下图3-3、3-4。
图 3-3 运行代码
图 3-4 运行结果
从结果可以看出,利用execve来进行调用vim创建新进程,由于程序代码中最后一个printf未执行可看出代码execve执行成功, execve函数是替换原来的程序代码,但是进程PID不会变,文件描述符不会变,只是程序代码被替换了,所以execve函数后面的语句都不会被执行。执行成功。
Test3:调用ping程序,创建新进程
运行代码及结果见下图3-5、3-6。
图 3-5 运行代码
图 3-6 运行结果
从结果可以看出,系统分配的进程号为5025,之后调用ping程序,ping www.lupaworld.com,在执行一段时间后使用快捷键ctrl+c。可以看到结果为10 packets transmitted,10 received,0% packet loss,time 9357ms可看出未发生丢包,以及最小值、平均值、最大值、方差值,程序执行成功。
Test4:显示当前目录下的文件信息,并测试网络连通情况
运行代码及结果见下图3-7、3-8。
图 3-7 运行代码
图 3-8 运行结果
从结果可以看出,返回值为0为子进程,并得到此进程的PID:5185,此进程的父进程号PPID:5184和当前目录下的信息,以及ping程序可以看出网络连接通畅。后面点击crtl+c可以看到返回值为5185为父进程,当前进程号为5184其父进程号为4916。执行成功。
Test5:测试exit(0)、_exit(0)区别
运行代码及结果见下图3-9、3-10。
图 3-9 运行代码
图 3-10 运行结果
从结果可以看出,exit(0)函数获取缓存后再退出,_exit(0)函数则直接异常退出。这也与我们预备知识中查找到的功能相符,利用构造缓冲成功测试出了它们之间的区别。
Test6:避免子进程成为僵尸进程
运行代码及结果见下图3-11、3-12。
图 3-11 运行代码
图 3-12 运行结果
图 3-13 运行结果
从结果可以看出,首先是父进程创建子进程后20s调用wait()函数,等待子进程退出,回收子进程的资源,这也意味着子进程将会成为僵尸进程5s。运行该程序后,打开终端,查看进程状态,图3-13显示的有一个进程的标志为Z,表示该进程为僵尸进程(Zombie)。当父进程调用wait()函数后,子进程的资源被回收,僵尸进程的标志被去掉了。避免了子进程成为僵尸进程达到了实验目的。
Test7:创建守护进程
运行代码及结果见下图3-14、3-15、3-16。
图 3-14 运行代码
图 3-15 运行结果
图3-16 执行流程图
从运行结果图3-15由-1的执行结果可以看出成功生成守护进程,在程序上半段,若child1大于0则直接终结父进程,在进入子进程中先进行创建新的会话,再改变工作目录到“temp”之后通过umask(0)重设文件创建掩码,最终关闭文件描述符,从这五步守护进程即创建成功。在程序后半段,首先判断child2是否为第二子进程若是则向系统日志文件写入文字并暂停10s然后退出,若是第一子进程则进入死循环。图3-16为本程序具体执行流程。
我的心得
本次的实验测试是对linux中进程的应用的实验,其中包含了进程ID号的获取、用三种方式创建新进程、检测网络状况、僵尸进程的预防,以及守护进程的创建等。
首先让我明白了三种方式创建新进程的不同之处,system()函数通过调用shell程序来执行所指向的命令(效率低),相当于先fork(),再execve(),原进程和子进程各自运行,且原进程需要等子进程运行完后再继续,exec系列函数调用时,启动新进程,替换掉当前进程。即程序不会再返回到原进程,除非exec调用失败。fork和exec的替换不同,调用fork函数,可复制一个和父进程一模一样的子进程。执行的代码也完全相同,但子进程有自己的数据空间,环境和文件描述符。还有最后一个查看输出信息时,通过查阅资料我知道了LOG_INFO为一般信息,存放在messages文件中,之后才通过tail命令查询出来。
大家如果发现测试中有不足之处欢迎指出讨论!!谢谢!!