[关闭]
@yanbo01haomiao 2021-04-11T13:39:29.000000Z 字数 1909 阅读 1088

实验二 进程创建及进程间通信

Linux



一、 实验目的

  1. 掌握Linux进程的创建方法,加深对进程概念的理解,明确进程和程序的区别。
  2. 认识进程并发执行的实质。
  3. 学习控制进程同步的方法。
  4. 分析进程竞争资源的现象,学习解决进程互斥的方法。
  5. 了解管道通信的特点,掌握管道通信的使用方法。

二、实验内容

  1. 运行Linux进程的创建程序,观察运行结果。
  2. 利用fork函数,编写程序。
  3. fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容。利用wait( )来控制进程执行顺序。
  4. lockf( )来给每一个进程加锁,以实现进程之间的互斥。
  5. pipe( )来实现进程的管道通信。

三、实验步骤

1.进程创建程序示例:

  1. #include<stdio.h>
  2. main(){
  3. int p1;
  4. while((p1=fork())= = -1);
  5. if(p1= =0){/*在子进程中*/
  6. printf(“This is a child process.”);
  7. } else{ /*在父进程中*/
  8. printf(“This is a parent process.”);
  9. }
  10. return 0;
  11. }

2.进程的创建。

编写一段C/C++程序,使用系统功能调用fork( )创建两个子进程。

要求:当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符a,子进程分别显示字符bc。试观察记录屏幕上的显示结果,并分析原因。
提示:实验结果需要运行多次找出不同结果并分析原因。

3.运行以下程序,并分析switch语句中各个case所做的事和产生原因。

wait( )给我们提供了一种实现进程同步的简单方法,它是如何实现进程同步的?

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. int main(){
  4. int pid;
  5. pid = fork();/*创建子进程*/
  6. switch(pid){
  7. case -1:
  8. printf("Error in fork()\n");
  9. exit(1);
  10. case 0:
  11. execl("/bin/ls","ls","-l","-color",NULL);
  12. printf("execl fail!\n");
  13. exit(1);
  14. default:
  15. wait(NULL);
  16. printf("is completed!\n");
  17. exit(0);
  18. }
  19. }

4.分析以下程序的输出结果。

可以使用cat to_be_locked.txt查看输出结果。多次验证看是否有不同结果,为什么?

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. int main(){
  4. int p1,p2,i;
  5. int *fp;
  6. fp = fopen("to_be_locked.txt","w+");
  7. if(fp==NULL){
  8. printf("Fail to create File\n");
  9. exit(-1);
  10. }
  11. while((p1 = fork())==-1){ /*创建子进程p1*/
  12. if(p1==0){
  13. lockf(*fp,1,0); /*加锁*/
  14. for(i=0;i<10;i++)
  15. fprintf(fp,"daughter %d\n",i);
  16. lockf(*fp,0,0); /*解锁*/
  17. }else{
  18. while((p2 = fork())==-1){ /*创建子进程p2*/
  19. if(p2==0){
  20. lockf(*fp,1,0);/*加锁*/
  21. for(int i=0;i<10;i++)
  22. fprintf(fp,"son %d\n",i);
  23. lockf(*fp,0,0);/*解锁*/
  24. }else{
  25. wait(NULL);
  26. lockf(*fp,1,0);/*加锁*/
  27. for(i = 0;i<10;i++)
  28. fprintf(fp,"parent %d\n",i);
  29. lockf(*fp,0,0);/*解锁*/
  30. } // end if p2 == 0
  31. }; // end p2
  32. } // end if p1 == 0
  33. }// end p1
  34. fclose(fp);
  35. }

5.编写程序:实现进程的管道通信.

用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句话:
Child 1 is sending a message!
Child 2 is sending a message!
父进程从管道中读出二个来自子进程的信息并显示。
要求:先接收P1,后P2。

操作系统实验仓库

github仓库地址
gitee码云仓库地址

详情请查看仓库中readme.md.实验手册与实验报告模板已经更新至ex2。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注