实验一进程管理实验
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ca[root@localhost ~]# b
分析原因:①从进程并发执行来看,各种情况都有可能。上面的三个进程没有同步措施,
所以父进程与子进程的输出内容会叠加在一起。输出次序带有随机性。
②由于函数printf()在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。
但由于进程并发执行的调度顺序和父子进程抢占处理机问题,输出字符串的顺序和先后随
#in clude<>
#in clude<>
main ()
{\
int p1,p2;
while((p 1=fork())==-1);
if(p1==0)
printf("child's pid=%d \n",getppid());
else
{
\while((p2=fork())==-1);
if(p2==0)
child 2's pid=4852
pare nt's pid=3224
[root@localhost ~]# ./lsj
child1's pid=4903
child 2's pid=4903
pare nt's pid=3224
[root@localhost ~]# ./Isj/
child 1's pid=4918
while((p2=fork())==-1);
if(p2= =0)
putchar('c');
else putchar('a');
}
}
运行
运行结果:root@localhost ~]# gcc -o lsj
[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符,父显示"a",
子进程分别显示“b”和“c”,观察记录显示结果,并分析原因。
#in clude<>
main()
{
in t p1,p2;
while((p 1=fork())= =-1);
if(p1==0)
putchar('b');
else
{
实验一
【实验目的】
1、加深对进程概念的理解,明确进程和程序的区别;
2、进一步认识并发执行的实质;
3、分析进程争用资源的现象,学习解决进程互斥的方法;
【实验环境】
编程环境:
操作系统软件:
【准备知识】
1.
1、进程的概念;进程与程序的区别。
2、并发执行的概念。
3、进程互斥的概念。
2.
系统调用是一种进入系统空间的办法。通常,在OS的核心中都设置了一组用于实现各
#i nclude <sys/>
/(pid_t) wait(i nt *statloc);
正确返回:大于0:子进程的进程ID值;
/等于0:其它。
错误返回:等于一1调用失败。
3
exit()函数是进程结束最常调用的函数,在main()函数中调用return,最终也
是调用exit()函数。这些都是进程的正常终止。在正常终止时,exit()函数返回进程
bca[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
ba[root@localhost ~]# c./lsj/
bca[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
结来自百度文库状态。
其调用格式为:#in elude<>
void exit(i nt status);
其中status为进程结束状态。
4
\kill()函数用于删除执行中的程序或者任务。
其调用格式为:kill(i nt PID,i nt IID);
其中:PID是要被杀死的进程号,IID为向将被杀死的进程发送的中断号。
2
wait()函数常用来控制父进程与子进程的同步。在父进程中调用wait()函数,则
父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,会产生一个终止 状态字,系统会向父进程发出SIGCHLD言号。当接到信号后,父进程提取子进程的终
止状态字,从wait()函数返回继续执行原程序。
其调用格式为:#i nclude <sys/>
统调用与之不同的是Linux由于内核代码完全公开,所以可以细致的分析出其系统调用的机 制。
3.
1
fork()函数创建一个新进程。
其调用格式为:int fork();
其中返回int取值意义如下:
正确返回: 等于0:创建子进程,从子进程返回的ID值;
大于0:从父进程返回的子进程的进程ID值。
11
错误返回:等于一1创建失败。
printf("child's pid=%d \n",getppid());
else printf("parent's pid=%d \n”,getppid());
}
}
结果:
[root@localhost ~]# gcc -o lsj
[root@localhost ~]# ./lsj
child 1's pid=4852
关于Linux下的C语言编程
1)编辑器可使用vi
2)编译器使用gee
格式:gee optio n file name
例如:gee -o main
主要的option
-o指定输出文件名(不指定则生成默认文件)
其它的参数见帮助(man gee)
【实验内容和步骤】
1
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统
pare nt's pid=3224
[root@localh ost ~]# child 2's pid=1 ./lsj
着执行的不同而发生变化。这与打印单字符的结果相同。
2.
修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行
时屏幕上岀现的现象,并分析原因。)
编写一段程序,使用系统调用fork()来创建两个子进程,并由父进程重复显示字符串:
“pare nt:”和自己的标识数,而子进程则重复显示字符串“child: ”和自己的标识数。
种系统功能的子程序,并将它们提供给程序员调用。程序员在需要OS提供某种服务的时候, 便可以调用一条系统调用命令,去实现希望的功能,这就是系统调用。因此,系统调用就像
一个黑箱子一样,对用户屏蔽了操作系统的具体动作而只是控制程序的执行速度等。各个不
同的操作系统有各自的系统调用,女口windows API,便是windows的系统调用,Linux的系
分析原因:①从进程并发执行来看,各种情况都有可能。上面的三个进程没有同步措施,
所以父进程与子进程的输出内容会叠加在一起。输出次序带有随机性。
②由于函数printf()在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。
但由于进程并发执行的调度顺序和父子进程抢占处理机问题,输出字符串的顺序和先后随
#in clude<>
#in clude<>
main ()
{\
int p1,p2;
while((p 1=fork())==-1);
if(p1==0)
printf("child's pid=%d \n",getppid());
else
{
\while((p2=fork())==-1);
if(p2==0)
child 2's pid=4852
pare nt's pid=3224
[root@localhost ~]# ./lsj
child1's pid=4903
child 2's pid=4903
pare nt's pid=3224
[root@localhost ~]# ./Isj/
child 1's pid=4918
while((p2=fork())==-1);
if(p2= =0)
putchar('c');
else putchar('a');
}
}
运行
运行结果:root@localhost ~]# gcc -o lsj
[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符,父显示"a",
子进程分别显示“b”和“c”,观察记录显示结果,并分析原因。
#in clude<>
main()
{
in t p1,p2;
while((p 1=fork())= =-1);
if(p1==0)
putchar('b');
else
{
实验一
【实验目的】
1、加深对进程概念的理解,明确进程和程序的区别;
2、进一步认识并发执行的实质;
3、分析进程争用资源的现象,学习解决进程互斥的方法;
【实验环境】
编程环境:
操作系统软件:
【准备知识】
1.
1、进程的概念;进程与程序的区别。
2、并发执行的概念。
3、进程互斥的概念。
2.
系统调用是一种进入系统空间的办法。通常,在OS的核心中都设置了一组用于实现各
#i nclude <sys/>
/(pid_t) wait(i nt *statloc);
正确返回:大于0:子进程的进程ID值;
/等于0:其它。
错误返回:等于一1调用失败。
3
exit()函数是进程结束最常调用的函数,在main()函数中调用return,最终也
是调用exit()函数。这些都是进程的正常终止。在正常终止时,exit()函数返回进程
bca[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
ba[root@localhost ~]# c./lsj/
bca[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
bca[root@localhost ~]# ./lsj
结来自百度文库状态。
其调用格式为:#in elude<>
void exit(i nt status);
其中status为进程结束状态。
4
\kill()函数用于删除执行中的程序或者任务。
其调用格式为:kill(i nt PID,i nt IID);
其中:PID是要被杀死的进程号,IID为向将被杀死的进程发送的中断号。
2
wait()函数常用来控制父进程与子进程的同步。在父进程中调用wait()函数,则
父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,会产生一个终止 状态字,系统会向父进程发出SIGCHLD言号。当接到信号后,父进程提取子进程的终
止状态字,从wait()函数返回继续执行原程序。
其调用格式为:#i nclude <sys/>
统调用与之不同的是Linux由于内核代码完全公开,所以可以细致的分析出其系统调用的机 制。
3.
1
fork()函数创建一个新进程。
其调用格式为:int fork();
其中返回int取值意义如下:
正确返回: 等于0:创建子进程,从子进程返回的ID值;
大于0:从父进程返回的子进程的进程ID值。
11
错误返回:等于一1创建失败。
printf("child's pid=%d \n",getppid());
else printf("parent's pid=%d \n”,getppid());
}
}
结果:
[root@localhost ~]# gcc -o lsj
[root@localhost ~]# ./lsj
child 1's pid=4852
关于Linux下的C语言编程
1)编辑器可使用vi
2)编译器使用gee
格式:gee optio n file name
例如:gee -o main
主要的option
-o指定输出文件名(不指定则生成默认文件)
其它的参数见帮助(man gee)
【实验内容和步骤】
1
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统
pare nt's pid=3224
[root@localh ost ~]# child 2's pid=1 ./lsj
着执行的不同而发生变化。这与打印单字符的结果相同。
2.
修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行
时屏幕上岀现的现象,并分析原因。)
编写一段程序,使用系统调用fork()来创建两个子进程,并由父进程重复显示字符串:
“pare nt:”和自己的标识数,而子进程则重复显示字符串“child: ”和自己的标识数。
种系统功能的子程序,并将它们提供给程序员调用。程序员在需要OS提供某种服务的时候, 便可以调用一条系统调用命令,去实现希望的功能,这就是系统调用。因此,系统调用就像
一个黑箱子一样,对用户屏蔽了操作系统的具体动作而只是控制程序的执行速度等。各个不
同的操作系统有各自的系统调用,女口windows API,便是windows的系统调用,Linux的系