semctl崩溃了!溃了!了!

老马何以识途 2017-06-16 06:08:28
执行时段错误,跟踪到执行semctl处,之前的semget顺利通过。这是为什么?我该查哪里的代码?在内核的哪个位置?

另一个程序则表现有点不同,semget返回-1,查看errno为2(No such file or directory)。此前的函数是ftok,已顺利返回非-1的数,semget的代码为:

semget(key, 1, 0)

key即ftok的返回值。

谢谢您的指点!
...全文
542 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
老马何以识途 2017-06-30
  • 打赏
  • 举报
回复
搞定了,就是你说的原因!原来在mips和x86都没问题,我就是移植到PowerPC。 谢谢!
引用 14 楼 lgbxyz 的回复:
[quote=引用 13 楼 hzy_76 的回复:] SETVAL的时候用的是union中的int成员,按理说应该可以? [quote=引用 12 楼 lgbxyz 的回复:] 应该是你semctl 第四个参数设置错了, cmd = SETVAL时 第四个参数是 union semun类型, 不能设置为int型

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
                                           (Linux-specific) */
           };
[/quote] 那也要视系统而定, 你的做法在x86等小端系统上没问题,但是在PowerPC等大端系统上肯定会崩溃的[/quote]
LubinLew 2017-06-30
  • 打赏
  • 举报
回复
引用 13 楼 hzy_76 的回复:
SETVAL的时候用的是union中的int成员,按理说应该可以? [quote=引用 12 楼 lgbxyz 的回复:] 应该是你semctl 第四个参数设置错了, cmd = SETVAL时 第四个参数是 union semun类型, 不能设置为int型

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
                                           (Linux-specific) */
           };
[/quote] 那也要视系统而定, 你的做法在x86等小端系统上没问题,但是在PowerPC等大端系统上肯定会崩溃的
老马何以识途 2017-06-30
  • 打赏
  • 举报
回复
SETVAL的时候用的是union中的int成员,按理说应该可以?
引用 12 楼 lgbxyz 的回复:
应该是你semctl 第四个参数设置错了, cmd = SETVAL时 第四个参数是 union semun类型, 不能设置为int型

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
                                           (Linux-specific) */
           };
老马何以识途 2017-06-29
  • 打赏
  • 举报
回复
昨天调试另外一个问题:php调用date函数段错误,情况跟本问题一相似。最后发现1G内存的机器上,分配的内存地址是0x481A0008,已经超出了物理地址范围。至于malloc为何会出现如此错误,还没搞明白。推测本问题一可能也是这样的,待我加了内存再说。
LubinLew 2017-06-29
  • 打赏
  • 举报
回复
应该是你semctl 第四个参数设置错了, cmd = SETVAL时 第四个参数是 union semun类型, 不能设置为int型

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
                                           (Linux-specific) */
           };
老马何以识途 2017-06-29
  • 打赏
  • 举报
回复
但是还是很可疑,因为收到的信号是SIGSEGV。malloc成功返回了,memcpy的源应该超出了该指针的范围,要不就这个导致的,要不就分配得到的地址无效。
老马何以识途 2017-06-29
  • 打赏
  • 举报
回复
是哦,昨天老大说这个问题我还隐隐感到不对,虚拟地址不是这么简单对比的!不过我们用的CPU是不是有MMU?可能还是确认一下好。
jklinux 2017-06-29
  • 打赏
  • 举报
回复
引用 8 楼 hzy_76 的回复:
昨天调试另外一个问题:php调用date函数段错误,情况跟本问题一相似。最后发现1G内存的机器上,分配的内存地址是0x481A0008,已经超出了物理地址范围。至于malloc为何会出现如此错误,还没搞明白。推测本问题一可能也是这样的,待我加了内存再说。
你的系统没用mmu功能的吗? 如有用,你应用程序里看到的地址是虚拟地址来的
老马何以识途 2017-06-27
  • 打赏
  • 举报
回复
补充:我在semctl调用之前打印有看到输出,错误分支(大括号内)第一行打印无输出,正确分支打印无输出,并且出现Segmentation fault
老马何以识途 2017-06-27
  • 打赏
  • 举报
回复
代码来了,在mips、x86平台都正常,刚检查过内核,System V IPC也打开着。

if(-1 == (key = ftok(ACE_MANAGE_USER_FILE_NAME, 0xF)))
{
	ace_printf("create key fail\r\n");
	return -4;
}

if((mutex_id = semget(key, 1, IPC_CREAT|00666)) == -1)
{
	ace_printf("sem get fail\r\n");
	return -5;
}

if(semctl(mutex_id, 0, SETVAL, 1) == -1)
{
	ace_printf("sem control init fail\r\n");
	return -6;
}
jklinux 2017-06-26
  • 打赏
  • 举报
回复
引用 4 楼 hzy_76 的回复:
感谢各位,问题二已解决:查看内核代码,发现不支持第三个参数为0的情况,会被判断为错误参数。 问题一还继续,但内核中System V IPC已打开。
确定不是代码引起的吗? 最好还是把相关部分代码贴一下
老马何以识途 2017-06-26
  • 打赏
  • 举报
回复
感谢各位,问题二已解决:查看内核代码,发现不支持第三个参数为0的情况,会被判断为错误参数。 问题一还继续,但内核中System V IPC已打开。
jklinux 2017-06-19
  • 打赏
  • 举报
回复
引用 2 楼 hzy_76 的回复:
[quote=引用 1 楼 lgbxyz 的回复:] 建议使用posix标准 不要使用System V
这跟崩溃有关吗?我是在移植,原来的代码在x86和mips都很好,要修改必须有充足的理由。[/quote] 确认下是不是key搞错的问题, 如果不是, 则有可能板上内核的配置里没选上下面配置: make menuconfig General setup --->
  • System V IPC
老马何以识途 2017-06-19
  • 打赏
  • 举报
回复
引用 1 楼 lgbxyz 的回复:
建议使用posix标准 不要使用System V
这跟崩溃有关吗?我是在移植,原来的代码在x86和mips都很好,要修改必须有充足的理由。
LubinLew 2017-06-17
  • 打赏
  • 举报
回复
建议使用posix标准 不要使用System V

23,128

社区成员

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

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