进程通信之四 信号量

直接上例子


/*
 * =====================================================================================
 *
 *       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

自己分析吧


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值