广东海洋大学操作系统.实验(2)

  • 格式:doc
  • 大小:82.50 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

班级:计科1141 学号:201411621110 姓名:邓超荣

实验二进程间通信(信号量)

实验目的了解信号量在进程控制中所起的重要作用。

实验内容

父子两个进程共同完成递增正整数序列(1\2\3\4\5\6\7\8\9\10\11\12\13\14\15\16……100)的显示。其中一个进程负责显示奇数,另一个进程显示偶数。

请分别编写“不带有信号量不能完成上述任务”和“使用信号量正确完成上述任务”的程序,观察实验结果,进行细致分析。

(1)不带有信号量不能完成上述任务

1:#include

2:#include :

3:#include :

4:#include

5:#include :

6:#include

7:union semun://使用union开辟空间,把定义的数据放到统一个足够大的空间

8:{

9: int val;//定义val,当执行SETVAL命令时使用

10: struct semid_ds *buf;//定义buf,在IPC_STAT/IPC_SET命令时使用11: unsigned short *array;//在使用GETALL/SETALL命令时使用的指针12: struct seminfo *__buf;//在IPC_INFO命令时使用

13:};

14:int init_semvalue (int id, int v)

15;{

16: union semun sem_union;//调用union semun 对象

17: sem_union.val = v;

18: semctl (id, 0, SETVAL, sem_union);//系统调用senmctl用来执行在信号量及上的控制操作;获取关键字值id,设置信号量的数目为0;SETVAL设置信号量集中的一个单独的信号量的值。

19: return (1);//返回1,则成功

20: }

21:int P (int id)//定义p()方法,控制信号量

22: {

23: struct sembuf op;

24: op.sem_num = 0;//将要处理的信号量个数为0

25: op.sem_op = -1;//sem_op为-1,信号量将减去1

26: op.sem_flg = 0;//定义操作标志为0

27: semop (id, &op, 1);//&op是指向将要操作的数组的指针;1为数组中的操作的个数

28: return 1;

29: }

30: int V (int id)//定义V()方法,控制信号量

31: {

32: struct sembuf op;

33: op.sem_num = 0;

34: op.sem_op = 1;

35: op.sem_flg = 0;

36:semop (id, &op, 1);

37: return 1;

38: }

39: int main (int argc, char *argv[])

40: {

41:int var_cri = 0; int s1,s2; pid_t pid;

42: s1 = semget ((key_t) 2234, 1, 0666 | IPC_CREAT);//创建信号量集s1 43: s2 = semget ((key_t) 2235, 1, 0666 | IPC_CREAT);//创建信号量集s2 44: init_semvalue(s1,1);

45:init_semvalue(s2,0);

46 pid = fork ();

47: if(pid != 0 ){

:48; int i = 1;

49: while (1){

50:

51: printf("%d,", i);

52: fflush(stdout);

53: i += 2;

54:

55: if(i>100)break;

56: }

57: }

58: else{

59: int i = 2;

60: while (1){

61:

62: printf("%d,", i);

63: fflush(stdout);

64: i += 2;

65:

66: if(i>100)break;

67: }

68: }

69:}

该程序分析如下:第9行中val用于存放信号量集中的一个单独信号量的值。第10行定义结构体buf,在信号量执行IPC_SET命令时存放信号量的许可权,第11行,array指针存放所有信号量的semvals值,定义_buf存放系统信道返回的信号量和参数信息。第14行到20行,系统通过调用semctl()方法,对信号量进行控制操作。第21行至29行设置信号量,对进程进行管理,第30行到38行同理;第42,43行创建信号量集s1和s2,第44行将s1的信号量设置为1,第45行将s2的信号量设置为0,第46行调用fork()方法生成一个几乎和原进程一样的进程,就拥有了两个进程,第47到69行,由于不带信号量,没有对进程进行控制,所以只能输出1/3/5/7/9…/97/99的信号量。

(2) 使用信号量正确完成上述任务

1:#include

2:#include :

3:#include :

4:#include

5:#include :

6:#include

7:union semun://使用union开辟空间,把定义的数据放到统一个足够大的空间

8:{

9: int val;//定义val,当执行SETVAL命令时使用

10: struct semid_ds *buf;//定义buf,在IPC_STAT/IPC_SET命令时使用11: unsigned short *array;//在使用GETALL/SETALL命令时使用的指针12: struct seminfo *__buf;//在IPC_INFO命令时使用

13:};

14:int init_semvalue (int id, int v)

15;{

16: union semun sem_union;//调用union semun 对象

17: sem_union.val = v;

18: semctl (id, 0, SETVAL, sem_union);//系统调用senmctl用来执行在信