信号量的基本流程
下面实例演示了关于信号量操作的基本流程。程序中使用semget函数创建一个信号量集,并使用semop函数在这个信号集上执行了一次资源释放操作。并在shell中使用命令查看系统IPC的状态。
(1)在vi编辑器中编辑该程序。
程序清单14-10 create_sem.c 使用semget函数创建一个信号量
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int sem_id;
int nsems = 1;
int flags = 0666;
struct sembuf buf;
sem_id = semget(IPC_PRIVATE, nsems, flags); /*创建一个新的信号量集*/
if ( sem_id < 0 ){
perror( semget ) ;
exit (1 );
}
/*输出相应的信号量集标识符*/
printf ( successfully created a semaphore : %d\n, sem_id );
buf.sem_num = 0; /*定义一个信号量操作*/
buf.sem_op = 1; /*执行释放资源操作*/
buf.sem_flg = IPC_NOWAIT; /*定义semop函数的行为*/
if ( (semop( sem_id, &buf, nsems) ) < 0) { /*执行操作*/
perror ( semop);
exit (1 );
}
system ( ipcs -s ); /*查看系统IPC状态*/
exit ( 0 );
}
(2)在vmware中编译该程序如下:
gcc -o a.o testc_semaphore.c
(3)在shell中运行该程序如下:
./a3.o
successfully created a semaphore : 0
------ Semaphore Arrays -------- key semid owner perms nsems 0x00000000 0 zcr 666 1 在上面程序中,用semget函数创建了一个信号量集,定义信号量集的资源数为1,接下来使用semop函数进行资源释放操作。在程序的最后使用shell命令ipcs来查看系统IPC的状态。
%注意:命令ipcs参数-s标识查看系统IPC的信号量集状态。