gpt4 book ai didi

sem_wait 时的核心转储

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:49 26 4
gpt4 key购买 nike

我这里有一个相当奇怪的问题,或者我不知道它的工作方式,但是我有下面的程序可以正确创建信号量并第一次运行到最后。但是在 sem_wait 处出现 SEGFault,如果信号量已经存在。我在 64 位 Fedora 17 上运行它。这与错误有什么关系吗?

#include <stdio.h>          /* printf()                 */
#include <stdlib.h> /* exit(), malloc(), free() */
#include <sys/types.h> /* key_t, sem_t, pid_t */
#include <sys/shm.h> /* shmat(), IPC_RMID */
#include <errno.h> /* errno, ECHILD */
#include <semaphore.h> /* sem_open(), sem_destroy(), sem_wait().. */
#include <fcntl.h> /* O_CREAT, O_EXEC */

int
main() {


sem_t *mysem;
int oflag = O_CREAT | O_EXCL;
mode_t mode = 0777;
const char semname[] = "mysem";
unsigned int value = 1;
int sts;


mysem = sem_open(semname, oflag, mode, value);
//sem_unlink(semname);

if(mysem == (void *)-1) {
printf("sem_open() failed");
exit(1);
}

printf("opened a semaphore successful\n");

if(!sem_wait(mysem)) {
/*locked */
printf("worked\n");
} else {
printf("error\n");
}
return 0;
}

/dev/shm 的内容sem.mysem

Program received signal SIGSEGV, Segmentation fault.
0x000000332980d5f0 in sem_wait () from /lib64/libpthread.so.0
Missing separate debuginfos, use: debuginfo-install glibc-2.15-58.fc17.x86_64
(gdb) where
#0 0x000000332980d5f0 in sem_wait () from /lib64/libpthread.so.0
#1 0x000000000040074a in main () at str2.c:31

奇怪的问题是,当我删除/dev/shm 中的信号量或取消注释 sem_unlink 时,它每次都有效。我在这里做错了什么还是我需要在某处运行 sem_post?

谢谢。

最佳答案

如果 sem_open 失败,它返回 SEM_FAILED,这在我的系统(可能还有其他人)上等同于 NULL。检查它而不是 -1

此外,如果失败,则打印实际错误(使用例如 perror()strerror())。

关于sem_wait 时的核心转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20487432/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com