当前位置:  技术问答>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操作时候报错的。



|
sem_flg | SEM_UNDO

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

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

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

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3