创建–>初始化–>设置信号量的值–>获取信号的值–>删除信号量
涉及到创建,操作,访问,还是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