实验二 进程创建

1.ps命令的使用(请将使用的命令和结果写在实验报告册中)

(1)显示所有进程,找出使用当前进程的进程ID号,查看其状态。

ps -aux

该命令显示所有包含其他使用者的进程

在这里插入图片描述
在这里插入图片描述
我并不理解什么叫“使用当前进程的进程ID号”,也许指的是ps -aux这个命令?如果是的话,ID号为22385 ,状态为R+,即运行状态、前台显示。

(2)列出目前所有面向用户的进程。(进程内可省略)

ps -ef

在这里插入图片描述

该命令表示查看全格式的全部进程(所以应该就是所有用户的进程吧?)

(3)显示所有自己所在用户的进程,并以长格式输出。

ps -U 用户名 -l

在这里插入图片描述

(4)用面向任务的格式显示个人用户中bash命令中的所有实例;并查看其父进程的详细信息。

ps -l|grep bash

在这里插入图片描述

不理解什么是“面向任务的格式”,这里用了长格式,也不理解什么是“个人用户中bash命令中的所有实例”,所以这里列出了名字中含bash的进程,可以看出,该进程父进程的id为4147

cat /proc/pid/status

在这里插入图片描述

2.进程的创建

(1)编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。
参考程序

<程序2.1>

#include <stdio.h>
main( )
{
int p1,p2;
while((p1=fork( ))= = -1);        /*创建子进程p1*/
if (p1= =0) putchar('b');       
else
{
while((p2=fork( ))= = -1);   /*创建子进程p2*/
if(p2= =0) putchar('c');  
else  putchar('a');    
}
}

分析并运行该程序回答如下问题,将结果与分析写在实验报告中。

问题1:该程序的运行结果为何?多次运行后结果是否相同,为什么?
多次运行结果如下:
在这里插入图片描述
程序运行结果为bac、abc,多次运行的结果不相同。因为3个进程没有同步措施,父进程和两个子进程的输出具有随机性。

问题2:修改该程序,使之在打印结果的同时标出是由哪个程序运行的出来的。(利用getpid()函数)

程序如下;
在这里插入图片描述
结果如下:
在这里插入图片描述

(2)进程的父进程和子进程
编写一段程序,使用系统调用fork()创建一个子进程。让子进程和父进程并发同时在每个进程中显示其子进程与父进程的PID号。

<程序2.2>

#include <stdlib.h>
#include <stdio.h>
#include<unistd.h>
int main(void)
{
pid_tpid;
printf("before calling fork,calling process pid = %d\n",getpid());
pid = fork();
    if(pid == -1)         /*创建失败*/
{printf("fork fail!\n");
exit(1);}		/*表示异常退出.这个1是返回给操作系统的*/
if(pid == 0){
printf("this is child process and child's pid = %d,parent'spid %d\n",getpid(),getppid());
    }
if(pid> 0){
 //sleep(1);	/*表示睡眠1秒*/
printf("this is parent process and pid =%d ,child's pid = %d\n",getpid(),pid);
    }

return 0;
exit(0);			/*表示正常退出*/
}

分析并运行该程序回答如下问题,将结果与分析写在实验报告中。
问题1:程序中红色部分的作用可以让执行该语句的进程等待一秒钟后继续执行,当不添加改语句时程序的运行结果是什么?为什么?
运行结果如下:
在这里插入图片描述
不添加sleep(1)时,程序不会等待1秒,不会将执行机会(CPU)让给其他线程
问题2:添加sleep(1)语句后程序的运行结果是什么?与不加该语句有何区别?为什么?
运行结果如下:
在这里插入图片描述
加上sleep(1)后,程序会等待1秒,将执行机会(CPU)让给其他线程,但是不会释放锁,因此休眠时间结束后自动恢复(程序回到就绪状态)
问题3:通过PS命令查看各个程序的状态,并分析。
将sleep改为10,即sleep(10),编译该程序,程序名为demo22:

gcc -o demo22 demo2.c

运行该程序:

./demo22

在10s内执行如下指令:

ps -aux|grep demo22

10s后再次执行:

ps -aux|grep demo22

在这里插入图片描述
第一次ps命令显示有3个名字中含demo22的程序,第一行状态为S+,表明当前程序正在睡眠,但可被某些讯号唤醒,第二行状态为Z+,表示该程序应该已经终止,但是其父程序却无法正常的终止他,造成僵尸程序的状态,第三行状态为R+,表示该程序目前正在运作,或者是可被运作。
第二次PS命令显示有1个名字中含有demo22的程序,状态为S+,可以看出,这个进程和第一次ps命令的第三行是同一个名字,这行的意思是我们查询的grep命令本身。

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Re:从零开始的代码生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值