进程通信之四 信号量

来源:互联网 发布: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

自己分析吧


原创粉丝点击