进程通信之四 信号量
来源:互联网 发布:java 卷二第十版pdf 编辑:程序博客网 时间:2024/05/22 13:04
直接上例子
/* * ===================================================================================== * * Filename: sem_ipc.h * * Description: Header file for IPC using sem * * Version: 1.0 * Created: 2012年02月21日 10时08分26秒 * Revision: none * Compiler: gcc * * Author: chn89, chn89@126.com * Organization: * * ===================================================================================== */#ifndef __SEM_IPC_H__#define __SEM_IPC_H__#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <stdlib.h>#include <stdio.h>#include <time.h>#include <unistd.h>#include <errno.h>#define MY_SEM_PATH "./"#define MY_SEM_ID 4union semun{ int val; struct semid_ds *buf; unsigned short *array;};#endif
/* * ===================================================================================== * * Filename: sem_client.c * * Description: IPC using sem client * * Version: 1.0 * Created: 2012年02月21日 10时43分40秒 * Revision: none * Compiler: gcc * * Author: chn89, chn89@126.com * Organization: * * ===================================================================================== */#include "sem_ipc.h"static int p_opt(int sem_id){ struct sembuf sem; sem.sem_num = 0; sem.sem_op = -1; sem.sem_flg = SEM_UNDO; if(-1 == semop(sem_id, &sem, 1)){ return -1; } return 0;}static int v_opt(int sem_id){ struct sembuf sem; sem.sem_num = 0; sem.sem_op = 1; sem.sem_flg = SEM_UNDO; if(-1 == semop(sem_id, &sem, 1)){ return -1; } return 0;}int main(){ int i,sem_id; int random_sleep; key_t key; time_t tm; srand((unsigned int)getpid()); time(&tm); printf("Process %d start @%s",getpid(),ctime(&tm)); key = ftok(MY_SEM_PATH, MY_SEM_ID); sem_id = semget(key, 0, 0666 | IPC_CREAT); if(sem_id < 0){ printf("semget error:%s with errno=0x%x\n",strerror(errno),errno); exit(-1); } random_sleep = rand()%4; sleep(random_sleep); if(0 != p_opt(sem_id)){ printf("p sem error\n"); exit(-1); } time(&tm); printf("Process %d hold sem@%s",getpid(),ctime(&tm)); sleep(1); if(0 != v_opt(sem_id)){ printf("v sem error\n"); exit(-1); } printf("Process %d return\n",getpid()); return 0;}
/* * ===================================================================================== * * Filename: sem_server.c * * Description: IPC using sem server * * Version: 1.0 * Created: 2012年02月21日 10时23分35秒 * Revision: none * Compiler: gcc * * Author: chn89 ,chn89@126.com * Organization: * * ===================================================================================== */#include "sem_ipc.h"int main(){ int i,sem_id; int random_sleep; key_t key; union semun sem_un; key = ftok(MY_SEM_PATH, MY_SEM_ID); sem_id = semget(key,1, 0666 | IPC_CREAT); if(sem_id < 0){ printf("semget error:%s with errno=0x%x",strerror(errno),errno); exit(-1); } sem_un.val = 2; if(-1 == semctl(sem_id, 0,SETVAL,sem_un)){ printf("semctl error:%s with errno=0x%x",strerror(errno),errno); exit(-1); } sleep(300); if(-1 == semctl(sem_id, 0, IPC_RMID, sem_un)){ printf("semctl error:%s with errno=0x%x",strerror(errno),errno); exit(-1); } return 0;}
#!/bin/sh./client &./client &./client &./client &
上面是测试脚本
执行顺序是:
#gcc sem_server.c -o server
#gcc sem_client -o client
#./server &
#./tool.sh
输出为
Process 12495 start @Tue Feb 21 13:30:02 2012
Process 12498 start @Tue Feb 21 13:30:02 2012
Process 12496 start @Tue Feb 21 13:30:02 2012
Process 12497 start @Tue Feb 21 13:30:02 2012
Process 12497 hold sem@Tue Feb 21 13:30:02 2012
Process 12497 return
Process 12498 hold sem@Tue Feb 21 13:30:04 2012
Process 12495 hold sem@Tue Feb 21 13:30:05 2012
Process 12498 return
Process 12496 hold sem@Tue Feb 21 13:30:05 2012
Process 12495 return
Process 12496 return
自己分析吧
- 进程通信之四 信号量
- 进程通信之信号量
- 进程通信之信号量
- 进程通信之信号量
- 进程通信之信号量
- 【进程通信】之信号量
- 进程通信之信号量
- 进程间通信之信号量
- Linux进程通信之信号量
- linux 进程通信之 信号量
- 进程间通信之信号量
- 进程间通信之信号量
- 进程间通信之信号量
- linux进程通信之信号量
- 进程间通信之信号量
- 进程间通信之信号量
- 进程间通信之信号量
- Linux--进程通信之信号量
- 使用mysql生成视图不能够使用汉字
- 犯了一个大错误,3A啊
- tar命令详解
- linux下安装vmware-workstation
- 词汇记载
- 进程通信之四 信号量
- tun/tap虚拟网卡
- Linux用户管理详解(中)
- HTTP 14.3 HTTP Header - Accept-Encoding
- Linux用户管理详解(下)
- 雅昌数据系统及应用系统构建方案---之二:非结构化数据处理与备份系统
- Belief
- 关于HTML中的列表
- 马洛斯