============= 信号量 =============
1. 进程1创建信号量集
2. 进程2连接该信号量集,sleep(60)——休眠60秒,之后利用该信号量进行加锁
3. 进程3连接该信号量集,之后将该信号量集删除。
运行过程:利用进程1创建信号量集,利用进程2连接该信号量进行加锁操作,在
休眠60秒,运行进程3,连接该信号量集,并将该信号量集删除。看看
进程2在60秒之后进行的加锁操作————肯定失败,就是要验证这个
追加: 当然可以在进程2中,加锁成功之后做一些操作,之后要删除该信号量集
在运行进程3,也可以将这么多都至于一个进程中处理。
要实现进程间通信的同步,就可以使用信号量。
========================================
运行结果:
终端1
[root@localhost shiyan]# gcc -g sem1.c -o sem1
[root@localhost shiyan]# gcc -g sem2.c -o sem2
[root@localhost shiyan]# gcc -g sem3.c -o sem3
[root@localhost shiyan]#
[root@localhost shiyan]# ./sem1 //运行进程1
semget1 create ok
终端2
[root@localhost shiyan]# ./sem2 //运行进程2
semget ok //之后在休眠60秒的时候,去运行进程3
semop lock is errno, errno 22 //休眠60秒之后,由于进程3将该信号量集删除,所以加锁失败
default
终端3
[root@localhost shiyan]# ./sem3 //运行进程3
semget ok !
semctl is ok //该信号集删除成功
[root@localhost shiyan]#
=========================================
============ 进程1 ================
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/sem.h>
int main(){
int semid1;
semid1 = semget((key_t)123, 2, IPC_CREAT|0666); //创建信号量集,里面包含两个信号量
if (-1 == semid1) {
printf("semget1 create errno\n");
return 1;
}else{
printf("semget1 create ok \n");
}
return 0;
}
=========================================
============ 进程2 ================
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/sem.h>
static struct sembuf op_trylock[2] = { //信号量加锁操作
{ 0, 0, IPC_NOWAIT },
{ 0, 1, SEM_UNDO }
};
int main(){
int semid;
int i;
int flg =-1;
semid = semget((key_t)123, 0,0); //连接该信号量集
if (-1 == semid) {
printf("semget errno\n");
return 1;
}else{
printf("semget ok \n");
}
sleep(60); //在休眠60秒的时候去运行进程3
for(i = 0; i <= 2; i++) { //信号量加锁操作
if(semop(semid, op_trylock, 2) < 0) {
printf("semop lock is errno, errno %d \n",errno);
switch(errno) {
case EAGAIN: //再试一次加锁
printf("EAGAIN \n");
break;
case EINTR: //中断导致加锁失败
printf("EINTR \n");
break;
default : //其他加锁失败
printf("default \n");
return -2;
}
}else{
flg = 1;
printf("semop is ok\n");
break;
}
usleep(10);
}
if(1==flg){
return 0;
}
return 1;
}
=========================================
============ 进程3 ================
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/sem.h>
int main(){
int semid = -1;
semid = semget((key_t)123,0,0); //连接该信号集
if(-1 == semid){
printf("semget errno !\n");
return 1;
}else{
printf("semget ok !\n");
}
if(semctl(semid, 0, IPC_RMID, 0) < 0) { //删除该信号集
printf("semctl is errno \n");
return -1;
}else{
printf("semctl is ok\n");
}
return 0;
}
=========================================