当前位置: 技术问答>linux和unix
有点东西没有想通(关于信号量)
来源: 互联网 发布时间:2015-05-21
本文导语: 以下程序是一个建立共享内存,和产生信号量的程序段,请问信号量是多少呢?如果我要建立信号量为3怎么做呢? int *readcount; int semset_id; void opensem(int * sid,key_t key) { if((*sid=semget(key,0,0666))==-1)//从这里看好像信...
以下程序是一个建立共享内存,和产生信号量的程序段,请问信号量是多少呢?如果我要建立信号量为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 existn");
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”为什么会失败呢?
最近要考试了,今天看了看书问题多多啊~~,请大家帮帮忙吧,鞠躬!
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 existn");
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”为什么会失败呢?
最近要考试了,今天看了看书问题多多啊~~,请大家帮帮忙吧,鞠躬!
|
推荐使用POSIX信号灯sem_open/sem_close/sem_wait等。具体的看man或者看UNP第二卷。
ftok是根据path生成一个key,相同的path和id会生成相同的key。key用来获取semaphore。
semget(key,0,0666)的nsems不能为0。0666是访问权限。
ftok是根据path生成一个key,相同的path和id会生成相同的key。key用来获取semaphore。
semget(key,0,0666)的nsems不能为0。0666是访问权限。
|
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*/
}
{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*/
}
|
使用windows的API吧,CreateSemaphore等函数,具体的请查MSDN
|
key相当与一个系统全局量,用于不同进程间通信!