信号量的创建/打开,访问

创建–>初始化–>设置信号量的值–>获取信号的值–>删除信号量
涉及到创建,操作,访问,还是IPC通信的三个步骤.semop等的分析放在后面
1.semcreate.c

#include"utili.h"

int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        printf("Arguments is error!");
        exit(EXIT_FAILURE);
    }
    //创建IPC键
    //pathname必须存在,进程必须可以访问
    key_t sem_key = ftok(argv[1], 0xff);//第二个参数the least significant 8 bits of proj_id (which must be nonzero),低序8位不能为0
    if(sem_key == -1)
    {
        perror("ftok error");
        exit(EXIT_FAILURE);
    }
    //打开IPC通道i,成功返回信号标示符,反之返回-1
    int sem_id = semget(sem_key, 1, IPC_CREAT | IPC_EXCL | 0755);//IPC_EXCL与IPC_CREAT一起使用,如果信号集已经存在,返回错误,errno置为EEXIST
                                                                //如果不创建一个新的新的信号量集,而只是访问一个已经存在的集合,就可以将第二个参数的值指定为0
                                                                //第三个参数参照第二卷图3-5
    if(sem_id == -1)
    {
        perror("semget");
        exit(EXIT_FAILURE);
    }
    else
        printf("Create sem ok!\n");

    return 0;
}

2.semgetval.c

#include"utili.h"

int main(int argc, char const* argv[])
{
    if(argc != 2)
    {
        printf("argc is error.\n");
        exit(EXIT_FAILURE);
    }
    int sem_key = ftok(argv[1], 0xff);
    if(sem_key == -1)
    {
        perror("ftok");
        exit(EXIT_FAILURE);
    }
    int sem_id = semget(sem_key, 0, 0);
    if(sem_id == -1)
    {
        perror("semget");
        exit(EXIT_FAILURE);
    }
    int res = semctl(sem_id, 0, GETVAL);//卷二P231,如果成功GETVAL,将获得信号量的值作为函数的返回值
    if(res == -1)
        perror("semctl");
    else
        printf("semval:>%d\n", res);
    return 0;
}

3.semsetval.c

#include"utili.h"
union semun {
    int              val;    /* Value for SETVAL */
    struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
    unsigned short  *array;  /* Array for GETALL, SETALL */
    struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                (Linux-specific) */
};
int main(int argc, char const* argv[])
{
    if(argc != 3)
    {
        printf("argc is error!\n");
        exit(EXIT_FAILURE);
    }
    union semun val;
    val.val = (atoi)(argv[2]);
    key_t sem_key = ftok(argv[1], 0xff);
    if(sem_key == -1)
    {
        perror("ftok");
        exit(EXIT_FAILURE);
    }
    int sem_id = semget(sem_key, 0, 0);
    int res = semctl(sem_id, 0, SETVAL, val);
    if(res == -1)
    {
        perror("semctl");
    }
    else
        printf("Set semval ok.\n");
    return 0;
}

4.semops.c

/*semop 对一个或者多个信号量进行操作+ - 0
 * */
#include"utili.h"

int main(int argc, char const* argv[])
{
    if(argc != 3)
    {
        printf("argc is not 3\n");
        exit(EXIT_FAILURE);
    }
    struct sembuf opsptr;
    opsptr.sem_num = 0;
    opsptr.sem_op = (atoi)(argv[2]);
    opsptr.sem_flg = 0;
    key_t sem_key = ftok(argv[1], 0xff);
    if(sem_key == -1)
    {
        perror("ftok");
        exit(EXIT_FAILURE);
    }
    int sem_id = semget(sem_key, 0, 0);
    if(sem_id == -1)
    {
        perror("semget");
        exit(EXIT_FAILURE);
    }
    int res = semop(sem_id, &opsptr, 1);
    if(res == -1)
    {
         perror("semop");
         exit(EXIT_FAILURE);
    }
    else
        printf("Semop Ok\n");
    return 0;
}

5.semrmid.c

#include"utili.h"

int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        printf("args is error!");
        exit(EXIT_FAILURE);
    }
    key_t sem_key = ftok(argv[1], 0xff);
    if(sem_key == -1)
    {
        perror("ftok");
        exit(EXIT_FAILURE);
    }
    int sem_id = semget(sem_key, 0, 0);
    int res = semctl(sem_id, 0, IPC_RMID);
    if(res == -1)
        printf("Remove sem error!\n");
    else
        printf("Remove sem ok!\n");

    return 0;
}

6.utili.h

#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include<stdlib.h>
#include<sys/sem.h>

7.Makefile

ALL:semcreate  semrmid semsetval semgetval  semops
semcreate:semcreate.c
    gcc semcreate.c -o semcreate
semrmid:semrmid.c
    gcc semrmid.c -o semrmid
semgetval:semgetval.c
    gcc semgetval.c -o semgetval
semops:semops.c
    gcc semops.c -o semops
semsetval:semsetval.c
    gcc semsetval.c -o semsetval
clean:
    /bin/rm -f semcreate  semgetval  semops  semrmid  semsetval
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值