免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4689 | 回复: 11
打印 上一主题 下一主题

精通Unix IPC信号量的朋友请进 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-11 10:22 |只看该作者 |倒序浏览
同样一段代码,在AIX、Solaris、Linux上没问题,在HP-UX上却不行


struct semun {
        int val;
        struct semid_ds *buf;
        ushort_t         *array;
};

/ InitialSemaphore
int InitialSemaphore(key_t key, int value)
{
        int semid;
        struct semun arg;
        int nret = 0;

        semid = semget(key, 1, IPC_CREAT);
        if (semid < 0)
                {
                                printf("semget error:errno=%d,%s\n",errno,strerror(errno));
                nret = -2;
                 }
        if (nret >;= 0) {
                arg.val = value;
                if (semctl(semid, 0, SETVAL, arg) < 0)

                                {
                                                /*此处产生了错误*/
                                                printf("semctl error:errno=%d,%s\n",errno,strerror(errno));
                        nret = -3;
                                 }
        }       

        if (nret >;= 0)
                nret = semid;
       
        return nret;
}

int
main()
{
     InitialSemaphore(0x76000000,200);
     return 0;
}

运行结果semctl error:errno=34,Result too large
其实semctl初始化的时候设的200也不大啊,哪位大虾可以解决啊,谢谢!

论坛徽章:
0
2 [报告]
发表于 2004-03-11 10:34 |只看该作者

精通Unix IPC信号量的朋友请进

if (semctl(semid, 0, SETVAL, &arg) < 0)

论坛徽章:
0
3 [报告]
发表于 2004-03-11 10:42 |只看该作者

精通Unix IPC信号量的朋友请进

谢谢,但是我看了一下HPUX的在线帮助,semctl第四个参数传的不是地址啊
NAME
      semctl - semaphore control operations

SYNOPSIS
      #include <sys/sem.h>;

      int semctl(int semid,
          int semnum,
          int cmd,
          union arg
      );

      union semun {
           int val;
           struct semid_ds *buf;
           ushort *array;
      } arg;

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2004-03-11 10:54 |只看该作者

精通Unix IPC信号量的朋友请进

那你取小点的数试试。

论坛徽章:
0
5 [报告]
发表于 2004-03-11 10:59 |只看该作者

精通Unix IPC信号量的朋友请进

我把arg.value设成了1 甚至0也还是那个错误提示,郁闷啊,上网查了两天好像也没有招到解决方法

论坛徽章:
0
6 [报告]
发表于 2004-03-11 11:14 |只看该作者

精通Unix IPC信号量的朋友请进

怎么能不是地址呢?是个union吧?你再往union里面看看。

论坛徽章:
0
7 [报告]
发表于 2004-03-11 11:19 |只看该作者

精通Unix IPC信号量的朋友请进

呵呵,是啊,第四个参数是个联合体结构啊,但不是地址

union semun {
           int val;
           struct semid_ds *buf;
           ushort *array;
      } arg;

int semctl(int semid,int semnum,int cmd,union arg);

arg.val = value;
f (semctl(semid, 0, SETVAL, arg) < 0)
           nret = -3;
我用的是HpUX11i

论坛徽章:
0
8 [报告]
发表于 2004-03-11 11:34 |只看该作者

精通Unix IPC信号量的朋友请进

semctl(semid, 0, SETVAL, 200)行不行?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2004-03-11 11:39 |只看该作者

精通Unix IPC信号量的朋友请进

你的例子我也在aix下试过了。没问题。
没用hp_ux,不知道为什么。

论坛徽章:
0
10 [报告]
发表于 2004-03-11 13:20 |只看该作者

精通Unix IPC信号量的朋友请进

呵呵,我找到bug了,是第四个参数是联合体而不是结构体,struct换成union就搞定了,谢谢各位啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP