这样的结构是在我的每个子进程中创建的。
struct locker_t {
uint16_t id;
uint16_t user_id;
uint8_t locked;
uint8_t owned;
int write_fd;
int read_fd;
int owner;
};
我希望我的子进程能够处理信号SIGUSR1和SIGUSR2。 如果孩子收到SIGUSR1,则将locker_t.locked更改为1.如果孩子收到SIGUSR2,孩子也会将locker_t.locked更改为0。 所以我创建了一个名为int lockSig的全局变量,它等于-1开始。我还创建了两个信号处理程序:
void lockHandler(int sig){
lockSig=1;
}
void unlockHandler(int sig){
lockSig=0;
}
我也有这两个接收信号并改变锁定:
signal(SIGUSR1,lockHandler);
signal(SIGUSR2,unlockHandler);
if(strcmp(buffer,"LOCK")==0||lockSig==1)//if lockSig is 1 then enter the if{
lock.locked=1;
fscanf(kid,"%d",&temp);//wait parent to run until gets an input
lockSig=-1;//change back to -1, wait for next signal
}
if(strcmp(buffer,"UNLOCK")==0||lockSig==0)//if lockSig is 0 then enter the if{
lock.locked=0;
fscanf(kid,"%d",&temp);//wait parent to run until gets an input
lockSig=-1;//change back to -1, wait for next signal
}
但是我的程序没有改变lock.locked。 I'm pretty sure the child gets the signal since I used printf to test it. I'm also using a infinite loop to read pipe inputs from parent and everything else works perfectly.
这是我第一次使用信号处理程序。我花了很多钱在谷歌试图找出如何做到这一点。真的需要一些帮助。