|
初学信号量的实用,大受打击啊,不知从何下手!
一个很简单的程序
我先说一下问题,就是当获得一个已经创建的信号量的时候,总说他没初始化
就是说arg.buf->sem_otime总是零
输出的结果:
key: 1627932278
semid: 360449
semget ok,but not init!!
求救啊,郁闷死了
#include<stdio.h>
#include<stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <errno.h>
#define max_tries 3
union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
unsigned short *array; /* array for GETALL & SETALL */
struct seminfo *__buf; /* buffer for IPC_INFO */
};
main()
{
int oflag,semid;
int initflag=0;
struct semid_ds sem_info;
struct sembuf askfor_res, free_res;
union semun arg;
int key;
key=ftok("./tt",'a');
printf("key: %d\n",key);
if(initflag==0)
{
oflag=IPC_CREAT|IPC_EXCL|00666;
if((semid=semget(key,1,oflag))>=0)
{
arg.val=1;
printf("okokokoko!!\n");
if(semctl(semid,0,SETVAL,arg)==-1)
perror("semctl setval error");
}
else if(errno==EEXIST)
{
oflag=IPC_CREAT|00666;
semid=semget(key,1,oflag);
printf("semid: %d\n",semid);
arg.buf=&sem_info;
for(i=0; i<max_tries; i++)
{
semctl(semid, 0, IPC_STAT, arg);
if(arg.buf->sem_otime!=0)
{
printf("exist!!\n");
goto init;
}
sleep(1);
}
printf("semget ok,but not init!!\n");
}
else
printf("semget error!!\n");
}
init:
initflag=1;
} |
|