广东海洋大学操作系统.实验(2)
- 格式:doc
- 大小:82.50 KB
- 文档页数:5
班级:计科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用来执行在信