- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用信号量编写一个小型 C 程序,但我遇到了这个我无法解决的问题。我总是在 sem_post 遇到段错误。这是我的服务器代码中主要方法的相关部分:
sem_t * sem_query = NULL;
sem_t * sem_server = NULL;
sem_t * sem_client = NULL;
//prepare semaphores
init_semaphores(sem_query, sem_server, sem_client);
//prepare the shared memory
struct shm_struct * shared = init_shm();
int exit_code = 0;
while (1) {
if (sem_post(sem_query) == -1) {
perror("Error posting the semaphore!");
exit_code = 1;
break;
}
if (sem_wait(sem_server) == -1) {
if (errno == EINTR) {
printf("Received interrupting signal! Quitting now...");
break;
} else {
perror("Error while waiting on semaphore!");
exit_code = 1;
break;
}
}
//calculate the response and write it to shm
calculate_and_write_response(shared, procs);
if (sem_post(sem_client) == -1) {
perror("Error posting the semaphore!");
exit_code = 1;
break;
}
if (sem_wait(sem_server) == -1) {
if (errno == EINTR) {
printf("Received interrupting signal! Quitting now...");
break;
} else {
perror("Error while waiting on semaphore!");
exit_code = 1;
break;
}
}
}
free_shm(shared);
free_semaphores(sem_query, sem_server, sem_client);
exit(exit_code);
这里是 init_semaphores 方法:
static void init_semaphores(sem_t * s1, sem_t * s2, sem_t * s3) {
s1 = sem_open(SEM_A_NAME, O_CREAT | O_EXCL, 0600, 0);
s2 = sem_open(SEM_B_NAME, O_CREAT | O_EXCL, 0600, 0);
s3 = sem_open(SEM_C_NAME, O_CREAT | O_EXCL, 0600, 0);
if (s1 == SEM_FAILED || s2 == SEM_FAILED || s3 == SEM_FAILED) {
perror("Could not open semaphores!");
free_semaphores(s1, s2, s3);
exit(1);
}
}
我没有在这里发布客户端线程的代码,因为它是无关紧要的:段错误在我启动服务器后立即发生,客户端进程没有运行。在段错误之前我的错误消息都没有打印出来。
这是 gdb 在运行程序时说的:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff79c6b44 in sem_post@@GLIBC_2.2.5 () from /lib64/libpthread.so.0
Missing separate debuginfos, use: debuginfo-install glibc-2.17-157.el7_3.1.x86_64
因此,如果我没看错的话,段错误发生在 sem_post() 调用时,这必须是对 sem_query 的第一次调用,因为程序会在 sem_wait() 调用时等待。
代码有什么问题?段错误从何而来?
最佳答案
你的信号量初始化不正确:
init_semaphores(sem_query, sem_server, sem_client);
init_semaphores
函数只会修改本地副本(s1
、s2
和s3
)。因此,init_semaphores()
中的更改不会更改 main() 中的指针,从而使您的信号量设置为 NULL。而是将指针传递给指针以修改它们:
//prepare semaphores
init_semaphores(&sem_query, &sem_server, &sem_client);
和
static void init_semaphores(sem_t **s1, sem_t **s2, sem_t **s3) {
*s1 = sem_open(SEM_A_NAME, O_CREAT | O_EXCL, 0600, 0);
*s2 = sem_open(SEM_B_NAME, O_CREAT | O_EXCL, 0600, 0);
*s3 = sem_open(SEM_C_NAME, O_CREAT | O_EXCL, 0600, 0);
if (*s1 == SEM_FAILED || *s2 == SEM_FAILED || *s3 == SEM_FAILED) {
perror("Could not open semaphores!");
free_semaphores(*s1, *s2, *s3);
exit(1);
}
}
关于c - sem_post 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41533104/
假设 10 个进程正在使用 sem_wait() 等待一个信号量。 第 11 个进程对该信号量调用 sem_post。 10 个进程中的哪个将进入关键块? 像随机吗?所有的进程都会被唤醒并争取实现一个
信号处理程序中对sem_post()的使用是否依赖未定义的行为? /* * excerpted from the 2017-09-15 Linux man page for sem_wait(3)
我正在尝试使用信号量编写一个小型 C 程序,但我遇到了这个我无法解决的问题。我总是在 sem_post 遇到段错误。这是我的服务器代码中主要方法的相关部分: sem_t * sem_query = N
我有一个带有信号量的队列。在某些时候,所有对 sem_post() 的调用总是返回“无效参数”错误,尽管信号量本身是有效的 信号量是C++对象的私有(private)成员,永远不会被删除,也可以在gd
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在尝试在 Linux 上创建一个包装器,它控制一次允许执行多少个并发执行。为此,我使用了系统范围内的计数信号量。我创建信号量,执行 sem_wait(),启动子进程,然后在子进程终止时执行 sem
这个问题已经有答案了: why is the semaphore not working? (3 个回答) 已关闭 4 年前。 sem_post() 无法正常工作,既不增加信号量的值,也不阻止附加到该
我正在做我的项目,正确清理所有内容并将所有缓冲的日志消息保存到文件等是至关重要的。我正在从另一个线程调用退出,我正在考虑使用信号量等待在程序完全退出之前在主线程中进行清理。问题是,当我从使用 atex
我认为我的代码不会打印文本 oh why come here!\n 但确实如此。 system() 有什么“错误”吗?因为,当我删除它时,代码按我的要求运行,停止了。 #include #inclu
我想在我的 linux(ubuntu 发行版)中编辑 sem_post() 和 sem_wait() 函数。但是我找不到功能的位置。我假设它在内核的 semaphore.c 上,但我找不到。我的lin
我正在尝试在 Windows 8 机器上使用 Eclipse 和 ARM Sourcery Windows GCC C 构建示例代码。当我编译代码时:我收到此错误: Undefined referen
我有一段代码需要快速运行,现在我正在使用 pthread_mutex_lock/pthread_mutex_unlock 来同步线程,但我发现它对性能有一定的影响。我想知道,如果有人对此进行基准测试,
这是一个奇怪的问题。我先初始化sem并销毁它,然后我在一个线程中再次初始化它。然后,我无法再次唤醒它。代码是: #include #include #include #include #inc
在 linux 代码中,我记得听说 mutex_lock() 周围有一个完整的内存屏障。我想确定它是否也在 sem_xxx 附近。 最佳答案 权威答案在这里: http://pubs.opengrou
我试图在我拥有的一段Python代码中锁定多个变量,每个变量一个锁。使用 semaphore.h 中提供的 sem_wait、sem_post、sem_init 例程可以轻松地在 C 语言中锁定变量。
我是一名优秀的程序员,十分优秀!