一、实验目的
1、掌握进程的概念,明确进程的含义
2、认识并了解并发执行的实质
二、实验内容
1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。
2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……',父进程显示 'parent ……',观察结果,分析原因。
三、实验代码及注释
1. #include <stdio.h> 2. main( ) 3. { 4. int p1,p2; 5. while((p1=fork( ))= = -1); /*创建子进程p1*/ 6. if (p1= =0) putchar('b'); 7. else 8. { 9. while((p2=fork( ))= = -1); /*创建子进程p2*/ 10. if(p2= =0) putchar('c'); 11. else putchar('a'); 12. } 13. }
1. #include <stdio.h> 2. main( ) 3. { 4. int p1,p2,i; 5. while((p1=fork( ))= = -1); /*创建子进程p1*/ 6. if (p1= =0) 7. for(i=0;i<10;i++) 8. printf("daughter %d\n",i); 9. else 10. { 11. while((p2=fork( ))= = -1); /*创建子进程p2*/ 12. if(p2= =0) 13. for(i=0;i<10;i++) 14. printf("son %d\n",i); 15. else 16. for(i=0;i<10;i++) 17. printf("parent %d\n",i); 18. } 19. }
四、运行结果截图
五、调试和运行程序过程中产生的问题及采取的措施
问题:步骤操作不正确,代码部分错误。
措施:请教老师,在同学的讨论下完成。
附:strace参数
-c 统计每一系统调用的所执行的时间,次数和出错的次数等.
-d 输出strace关于标准错误的调试信息.
-f 跟踪由fork调用所产生的子进程.
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h 输出简要的帮助信息.
-i 输出系统调用的入口指针.
-q 禁止输出关于脱离的消息.
-r 打印出相对时间关于,,每一个系统调用.
-T 显示每一调用所耗的时间.
-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-V 输出strace的版本信息.
-a column
设置返回值的输出位置.默认 为40.
-e expr
指定一个表达式,用来控制如何跟踪.格式如下:
[qualifier=][!]value1[,value2]...
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.例如:
-o filename
将strace的输出写入文件filename
-p pid
跟踪指定的进程pid.
-s strsize
指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-u username
以username 的UID和GID执行被跟踪的命令