有点东西没有想通(关于信号量)

hillhero789 2003-12-06 10:06:44
以下程序是一个建立共享内存,和产生信号量的程序段,请问信号量是多少呢?如果我要建立信号量为3怎么做呢?
int *readcount;
int semset_id;

void opensem(int * sid,key_t key)
{
if((*sid=semget(key,0,0666))==-1)//从这里看好像信号量应该是零吧?key在这里有什么用呢?0666又是什么呢?
{ printf("semaphore set does not exist\n");
exit(1);
};
}
int * openshm(int n,int size)
{
key_t key;
int shmid,cntr;
char *segptr;
key=ftok(".",'s')+n;
if((shmid=shmget(key,size,0))==-1)
{ perror("shmget");
exit(1);
}
if((segptr=shmat(shmid,0,0))==-1)
{ perror("shmat");
exit(1);
}
return((int*) segptr);
}

key=ftok(".",'s');//请解释一下这个函数,key是什么?有什么用,看帮助看了半天还是没有看懂
opensem(&semset_id,key);
readcount=(int*)openshm(1,100);


完整的程序的运行结果是:“semaphore set does not exist”为什么会失败呢?
最近要考试了,今天看了看书问题多多啊~~,请大家帮帮忙吧,鞠躬!
...全文
89 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hillhero789 2003-12-10
  • 打赏
  • 举报
回复
感谢大家
还有一点问题,如果我要建立信号量为3怎么做呢?
zwhqa 2003-12-10
  • 打赏
  • 举报
回复
union semun
{int val;
struct semid_ds *buf;
unsigned short int *array;
};
union semun semopts;
main(){
int semid;
semid=semget(100,1,IPC_CREAT|0666);
semopts.val=3; semctl(semid,0,SETVAL,semopts);/*建立信号量为3*/
}
fierygnu 2003-12-10
  • 打赏
  • 举报
回复
semget生成的信号灯即使应用退出也不会释放,必须用ipcrm应用来删除。你先创建了一个,成功了,又要用相同的key创建两个,不一致,所以有EINVAL错误。

sem_open这些IPC通信的东西看《UNIX网络编程》第二卷。

IPC_PRIVATE是一个特殊的key,用这个key每次都创建一个新的信号灯。
hillhero789 2003-12-10
  • 打赏
  • 举报
回复
to fierygnu(va_list)
对了
我试了一下,怎么用man sem_open 看不到东西?
还有能不能帮我推荐一本这方面的书呢?
再次谢谢
hillhero789 2003-12-10
  • 打赏
  • 举报
回复
to fierygnu
对不起,我不太懂你的意思?(我没有先创建一个再创建两个,我的意思是只调用createSem(&semID,2),而在它前面是没有执行createSem(&semID,1)的。问题是我不明白为什么调用createSem(&semID,2)的时候就不会像调用createSem(&semID,1)一样顺利,而会出出现“semget:Invalid argument”的错误提示?)



那假如我要产生n 个信号灯,应该怎么写呢?


(我看帮助里边说:a new set of nsems of semaphores is created if key has the value of IPC_PRIVATE or ...... 不是很懂它的意思)

多谢指教!
fierygnu 2003-12-10
  • 打赏
  • 举报
回复
你先创建了1个,又要创建2个,当然不对。用ipcrm删了。
这也是推荐sem_open/sem_close的原因之一。
hillhero789 2003-12-10
  • 打赏
  • 举报
回复
怎么会有这样的问题:
createSem(int * sid,int num)
{
key_t key;
key=ftok(".",'s');
if((*sid=semget(key,num,IPC_CREAT|0666))==-1)/*里边的'1'是制定信号灯的个数*/
{ /*printf("in opensem,semaphore set does not exist\n");*/
perror("semget");
exit(1);
}
}

int semID;
createSem(&semID,1);
/*这样就可以,但是如果我把1改成2程序就会提示“semget:Invalid argument”,这是什么回事呢?我想用createSem的参数num控制产生的信号灯的个数,怎么才能办到呢?*/
fierygnu 2003-12-08
  • 打赏
  • 举报
回复
推荐使用POSIX信号灯sem_open/sem_close/sem_wait等。具体的看man或者看UNP第二卷。

ftok是根据path生成一个key,相同的path和id会生成相同的key。key用来获取semaphore。
semget(key,0,0666)的nsems不能为0。0666是访问权限。
ruancsdn 2003-12-08
  • 打赏
  • 举报
回复
key相当与一个系统全局量,用于不同进程间通信!
hillhero789 2003-12-07
  • 打赏
  • 举报
回复
upup
hillhero789 2003-12-07
  • 打赏
  • 举报
回复
大家帮帮忙拉呵呵和
sonique 2003-12-07
  • 打赏
  • 举报
回复
使用windows的API吧,CreateSemaphore等函数,具体的请查MSDN

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧