linux 信号量(进程间通信)
来源:互联网 发布:数据酋长 ebay分析 编辑:程序博客网 时间:2024/06/05 06:59
http://blog.csdn.net/hubi0952/article/details/7971342
将使用一个程序来演示信号量的使用,程序用PV操作控制信号量,以操作临界区,P操作让信号量减1,V操作让信号量加1,而PV操作之间的代码即为临界区关键代码。每次只能由一个进程访问。
程序创建出一个子进程,在两个进程中分别有一段临界区关键代码,实现的功能都是不断的顺序输出0~9的字符。
保证进程间同步
- #include <unistd.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- static int init_semvalue (int);
- static void del_semvalue (int);
- static int P (int);
- static int V (int);
- //自己定义的semun结构体
- union semun
- {
- int val;
- struct semid_ds *buf;
- unsigned short *array;
- struct seminfo *__buf;
- };
- int
- main (int argc, char *argv[])
- {
- int var_cri = 0;
- int sem_id;
- pid_t pid;
- //创建一个信号量
- sem_id = semget ((key_t) 2234, 1, 0666 | IPC_CREAT);
- //初始化一个信号量
- if (!init_semvalue (sem_id))
- {
- fprintf (stderr, "Failed to initialize semaphore!\n");
- exit (EXIT_FAILURE);
- }
- //创建子进程
- if ((pid = fork ()) == 0) //子进程
- {
- while (1)
- {
- //临界区
- if (!P (sem_id))//申请资源
- exit (EXIT_FAILURE);
- int i;
- for (i = 0; i != 10; ++i)
- {
- printf ("[child]: %d\n", i);
- sleep (1);
- }
- if (!V (sem_id))//释放资源
- exit (EXIT_FAILURE);
- }
- }
- else if (pid > 0) //父进程
- {
- sleep (2);
- while (1)
- {
- //临界区
- if (!P (sem_id))
- exit (EXIT_FAILURE);
- int i;
- for (i = 0; i != 10; ++i)
- {
- printf ("[parent]: %d\n", i);
- sleep (1);
- }
- if (!V (sem_id))
- exit (EXIT_FAILURE);
- }
- sleep (8);
- //销毁信号量
- del_semvalue (sem_id);
- }
- exit (EXIT_SUCCESS);
- }
- static int
- init_semvalue (int id)
- {
- union semun sem_union;
- sem_union.val = 1;
- if (semctl (id, 0, SETVAL, sem_union) == -1)//设置信号量集中的信号量值value
- return (0);
- return (1);
- }
- static void
- del_semvalue (int id)
- {
- union semun sem_union;
- if (semctl (id, 0, IPC_RMID, sem_union) == -1)//IPC——RMID将信号量集从内存中删除
- fprintf (stderr, "Failed to delete semaphore\n");
- }
- int
- P (int id)
- {
- struct sembuf op;
- op.sem_num = 0;//单信号
- op.sem_op = -1;//P操作
- op.sem_flg = 0;
- if (semop (id, &op, 1) < 0)//改变key,它代表进程要使用的某个资源
- return 0;
- return 1;
- }
- int
- V (int id)
- {
- struct sembuf op;
- op.sem_num = 0;
- op.sem_op = 1;//V操作
- op.sem_flg = 0;
- if (semop (id, &op, 1) < 0)
- return 0;
- return 1;
- }
0 0
- linux 信号量(进程间通信)
- Linux进程间通信(四): 信号量
- linux 信号量(进程间通信)
- Linux进程间通信(信号量)
- Linux进程间通信(3)--信号量
- linux进程间通信-信号量(semaphore)
- linux进程间通信--信号量
- Linux 进程间通信--- 信号量
- linux进程间通信--信号量
- Linux进程间通信信号量
- Linux进程间通信-信号量
- Linux进程间通信-信号量
- linux 进程间通信 信号量
- 【Linux进程间通信】 - 信号量
- Linux进程间通信--信号量
- Linux进程间通信:信号量
- Linux进程间通信---信号量
- Linux进程间通信 -- 信号量
- sublime使用简介
- 我的账号csdn账号竟然被偷了
- 《深入理解java虚拟机》Java虚拟机垃圾收集器
- 第十二周 项目三:用递归方法求出n的阶乘
- C语言改变控制台输出内容颜色
- linux 信号量(进程间通信)
- automake,autoconf使用详解
- js获取url值
- 矩阵快速幂模板
- Red5入门教程(部分修改)
- Scroll View 控件以Thumbnail的方式显示一个文件夹的所有图片,类似图片浏览器
- listView里面item中控件添加点击事件需要
- svn is already under version control问题解决
- 一个apk调用另一个apk的native方法