直接上例子
/*
* =====================================================================================
*
* 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 4
union 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
自己分析吧