linux 信号量
2012-09-12 16:40:29 来源:WEB开发网核心提示: 将使用一个程序来演示信号量的使用,程序用PV操作控制信号量,linux 信号量,以操作临界区,P操作让信号量减1,程序创建出一个子进程,在两个进程中分别有一段临界区关键代码,V操作让信号量加1,而PV操作之间的代码即为临界区关键代码
将使用一个程序来演示信号量的使用,程序用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; }
- ››linux下两台服务器文件实时同步方案设计和实现
- ››Linux文件描述符中的close on exec标志位
- ››Linux下管道使用的一些限制
- ››Linux 误删/usr/bin 解决方法
- ››linux 添加新用户并赋予sudo执行权限
- ››linux常用软件安装方法
- ››Linux的分区已经被你从Windows中删除,系统启动后...
- ››linux enable命令大全
- ››Linux实现基于Loopback的NVI(NAT Virtual Interfa...
- ››Linux远程访问windows时,出现"连接被对端重...
- ››linux中使用head命令和tail命令查看文件中的指定行...
- ››linux swap 分区调控(swap分区 lvm管理)
更多精彩
赞助商链接