return0;}
三、主要仪器设备及耗材Ubuntu操作体统Vi编辑器G++编译
第二部分:
实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)【进程的创建】1)(()创建两个子进程,当此进程运行时,在系fork编写一段程序,使用系统调用父进让每一个进程在屏幕上显示一个字符,统中有一个父进程和两个子进程活动,,试观察记录屏幕上的显c”和字符“”程显示字符“a”;子进程分别显示字符“b示结果,并分析原因。
:
【源程序】#include
intmain()
{
intp1,p2;
while((p1=fork())==-1);
if(p1==0)//第一子进程putchar('b');
else{
while((p2=fork())==-1);
if(p2==0)
第二子进程putchar('c');//else
父进程putchar('a');//}
return0;
}
…bac,,acbcbabca运行多次:
主要输出有,偶尔输出cab和,abc生成的子进程和父进程是并行运行fork()会有如此多种不同输出,主要是因为很大概率系统的,所以先运行哪个进程是由系统的调度算法决定的,ubuntu9.04()运行之后很大概率先运行子进程,在ubuntu9.04fork是因为会先输出bca导当然也有可能先运行父进程后子进程,再运行父进程。
再加上进程间的并发性;
致了输出的多样性。
输出次序带有随机性。
。
【进程的控制】
(2)将每个进程输出一个字符改为每个进程输出一句修改已编写的程序,并分析原因。
在观察程序执行时屏幕上出现的现象,,话:
【源代码】#include
intmain(){
intp1,p2;
while((p1=fork())==-1);
;第一个子进程if(p1==0)
printf(Child1isrunning!
\n);
else{
while((p2=fork())==-1);
if(p2==0);第二子进程printf(Child2isrunning!
\n);
else;父进程printf(Fatherisrunning!
\n);
}
return0;
}
运行多次,大部分运行后输出:
Child1isrunning!
Child2isrunning!
Fatherisrunning!
少数输出:
Child2isrunning!
Child1isrunning!
Fatherisrunning!
Fatherisrunning!
Child1isrunning!
Child2isrunning!
……
但由还是由于系统的调度算法,程序的并发性影响;理论上是有6种不同的结果,在输出字符串时不会被中断,因此,字符串内部字符顺序输出不printf()于函数变。
所以与打印单字符的结果相同。
观察并分析,,创建进程使用exec函数族使子进程执行新的目标程序出现的现象。
【源代码】:
#include
#include
intmain()
{
printf(===systemcallexecltesting===\n);
execlp(date,date,0);
printf(execerror!
\n);
return0;
}
输出:
===systemcallexecltesting===
21:
35:
18CST星期五月04日2009年12
输出结果分析:
函数时,用指定的目标进程exec是一种exec函数,当进程调用一种execlp调用成功后,调用进程的正文段被指定的文件的正文Exec更好进程的执行映像。
以后的所有语句,所以本exec段所覆盖。
调用成功时,exec不返回,从而不执行”的情况。
如果调用失CST星期五21:
35:
1812月04日例就只有输出“2009年,执行剩余指令。
败,返回-1
(3)【进程信号处理】让再用系统调用singal()编写程序使用系统调用fork()创建两个子进程,
父进程,键);当捕捉到中断信号后即按父进程捕捉键盘上来的中断信号(Ctrl+c
子进程捕捉到信号后分别输出下列信,用系统调用Kill()向两个子进程发出信号:
息后终止ChildProcess11isKilledbyParent!
ChildProcess12isKilledbyParent!
:
输出如下的信息后终止父进程等待两个子进程终止后ParentProcessisKilled!
【源代码】:
#include
#include
intwait_mark;
voidwaiting()
{
while(wait_mark==1);
}
voidstop()
{
wait_mark=0;
}
intmain()
{
intp1,p2;
while((p1=fork())==-1);
;第一个子进程if(p1==0)
{
wait_mark=1;
signal(SIGINT,SIG_IGN);
signal(16,stop);
waiting();
lockf(1,1,0);;加锁printf(ChildProcess11isKilledbyParent!
\n);
lockf(1,0,0);;解锁exit(0);
}
Else
{
while((p2=fork())==-1);
;第二个子进程if(p2==0)
{
wait_mark=1;
signal(SIGINT,SIG_IGN);
signal(17,stop);
waiting();
;加锁lockf(1,1,0);
printf(ChildProcess12isKilledbyParent!
\n);
;解锁lockf(1,0,0);
exit(0);
}
Else;父进程{
wait_mark=1;
signal(SIGINT,stop);
waiting();
kill(p1,16);
kill(p2,17);
wait(0);
wait(0);
printf(ParentProcessisKilled!
\n);
exit(0);
}
}
}
输出结果有两种:
ChildProcessllisKilledbyParent!
ChildProcessl2isKilledbyParent!
ParentprocessisKilled!
ChildProcessl2isKilledbyParent!
ChildProcessllisKilledbyParent!
ParentprocessisKilled!
二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
三、实验小结、建议及体会的使用方法。
同时发现自forkLinux通过这次实验掌握系统中进程控制原语有很多的不熟悉的地方,在以后会进一步加强。
己对Linux