Linux下C语言编程——信号处理

1.信号产生
Linux下C语言编程——消息管理

1.POSIX无名信号量(Linux只实现了无名信号量)

#include<semaphore.h>

int sem_init(sem_t *sem,int pshared,unsigned int value);//创建一个信号灯,并初始化其值为value。pshared决定了信号能够在几个进程间的共享,由于目前Linux还没有实现进程间共享信号灯,所以这个值只能取0
int sem_destroy(sem_t *sem);//用来删除信号灯
int sem_wait(sem_t *sem);//调用将阻塞进程,直到信号灯值>0,这个函数返回的时候自动将信号灯的值减一。
int sem_trywait(sem_t *sem);//和sem_wait相同,但不阻塞,当信号灯的值为0的时候返回EAGAIN,表示以后重试
int sem_post(sem_t *sem);//和sem_wait相反,将信号灯内同+1同时发出信号唤醒等待的进程.
int sem_getvalue(sem_t *sem);//得到信号灯的值

2.System V信号量


#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/wem.h>
struct sembuf
{
	short sem_num;//使用哪一个信号
	short sem_op;//进行什么操作
	short sem_flg;//操作的标志
}
key_t ftok(char *pathname,char proj);//根据pathname和proj来创建一个关键字
int semget(key_t key,int nsems,int semflg);//创建一个信号量,成功返回信号ID,key是一个关键字,,可以是用ftok创建的也可以使IPC_PRIVATE表明由系统选用一个关键字,nsems表明我们创建的信号的个数.semflg是创建的权限标志,和我们创建一个文件的标志相同。

int semctl(int semid,int semnum,int cmd,union semun arg);//对信号量进行一系列控制,semid是要操作的信号标志,semnum是信号的个数,cmd是操作的命令,经常用到的两个值是SETVAL(设置信号量的值)和IPC_RMID(删除信号灯),arg是一个给cmd的参数。
int semop(int semid,struct sembuf *spos,int nspos);//对信号进行操作的函数,spos是一个操作数组表明要进行什么操作,nspos表明数组的个数,如果sem_op>0,那么操作将sem_op加入信号量的值中并唤醒等待信号增加的进程,如果sem_op=0,当信号量的值是0的时候,函数返回,否则阻塞直到信号量的值为0,如果小于0,函数判断信号量的值加上这个负值,如果结果为0则唤醒等待信号量为0的进程,如果小于0函数阻塞,如果大于0,那么从信号靓丽减去这个值并返回。


猜你喜欢

转载自blog.csdn.net/deng529828/article/details/7600711