日期:2014-05-16  浏览次数:21081 次

信号灯操作报错:semop:EINVAL(信号量集不存在或参数无效)
求助,有对信号灯操作比较熟的群友没?我用信号灯实现两个进程间同步,这两个进程没有亲缘关系,每通信6次就会出现semop报错:EINVAL(信号量集不存在或参数无效)。这时候打印的sid会变很大sid =1819043176,没出错之前sid一直正常,以前没有用过信号灯,不知道什么原因,大家给点建议或猜测都可以,先谢谢了。

主要操作代码:

int createsem(key_t key)
{
int sid;
union semun
{
int val;
struct semid_ds *buf;
ushort *arrary;
}arg;

if((sid = semget(key,1,0666|IPC_CREAT)) == -1)
{
perror("semget");
}
arg.val = 0;
if(semctl(sid,0,SETVAL,arg) == -1)
{
perror("semctl");
}

return sid;
}

static void semcall(int sid, int op)
{
struct sembuf sb;
sb.sem_num = 0;
sb.sem_op = op;
sb.sem_flg = 0;
if(semop(sid,&sb,1) == -1)
{
perror("semop");
}
}

void P(int sid)
{
semcall(sid,-1);
}

void V(int sid)
{
semcall(sid,1);
}

key = ftok("./semkey",32548748);
sid = createsem(key);


A进程P操作,B进程V操作,A和B通信6次就报错,做V操作时候报错的。




------解决方案--------------------
sem_flg | SEM_UNDO

是应该的,否则进程崩溃了信号量不会被恢复。

你再次跑的时候就会更加崩溃。

第一次崩溃的原因可能不在信号量这里。