LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 531|回复: 0

请教一个奇怪的信号量问题:)

[复制链接]
发表于 2004-8-20 21:39:53 | 显示全部楼层 |阅读模式
初学信号量的实用,大受打击啊,不知从何下手!
一个很简单的程序
我先说一下问题,就是当获得一个已经创建的信号量的时候,总说他没初始化
就是说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;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表