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

来源:互联网 发布:知乎如何挑选钻戒 编辑:程序博客网 时间:2024/04/29 10:24

创建–>初始化–>设置信号量的值–>获取信号的值–>删除信号量
涉及到创建,操作,访问,还是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  semopssemcreate:semcreate.c    gcc semcreate.c -o semcreatesemrmid:semrmid.c    gcc semrmid.c -o semrmidsemgetval:semgetval.c    gcc semgetval.c -o semgetvalsemops:semops.c    gcc semops.c -o semopssemsetval:semsetval.c    gcc semsetval.c -o semsetvalclean:    /bin/rm -f semcreate  semgetval  semops  semrmid  semsetval
1 0
原创粉丝点击