当前位置: 技术问答>linux和unix
信号灯操作报错:semop:EINVAL(信号量集不存在或参数无效)
来源: 互联网 发布时间:2017-01-13
本文导语: 求助,有对信号灯操作比较熟的群友没?我用信号灯实现两个进程间同步,这两个进程没有亲缘关系,每通信6次就会出现semop报错:EINVAL(信号量集不存在或参数无效)。这时候打印的sid会变很大sid =1819043176,没出...
求助,有对信号灯操作比较熟的群友没?我用信号灯实现两个进程间同步,这两个进程没有亲缘关系,每通信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操作时候报错的。
主要操作代码:
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
是应该的,否则进程崩溃了信号量不会被恢复。
你再次跑的时候就会更加崩溃。
第一次崩溃的原因可能不在信号量这里。
是应该的,否则进程崩溃了信号量不会被恢复。
你再次跑的时候就会更加崩溃。
第一次崩溃的原因可能不在信号量这里。