- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我认为我的代码不会打印文本
oh why come here!\n
但确实如此。
system()
有什么“错误”吗?因为,当我删除它时,代码按我的要求运行,停止了。
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
pthread_t id0, id1;
sem_t sp;
void *fun0(void *) {
// When erasing the following line "system("");",
// it block up, and doesn't print "oh why come here!\n".
// But with it, it print the text!
system("");
return NULL;
}
void *fun1(void *) {
sem_wait(&sp);
fprintf(stderr, "oh why come here!\n");
return NULL;
}
int main() {
sem_init(&sp, 0, 0);
pthread_create(&id0, 0, fun0, NULL);
pthread_create(&id1, 0, fun1, NULL);
void *stat0, *stat1;
pthread_join(id0, &stat0);
pthread_join(id1, &stat1);
return 0;
}
编译器:gcc 4.1.2Linux内核:2.6.18
我用 gcc 4.6.3,内核 3.2.0 编译它,它也按我想要的方式运行。所以我认为这是因为 gcc 4.1.2 或内核 2.6.18。
最佳答案
system()
调用与它无关。我的超能力告诉我 sem_wait
失败并显示错误代码而不是等待——检查返回值。例如,我可以在 Mac OS X 上重现您的结果,因为在 Mac OS X 上,sem_init()
总是因 ENOSYS
(“功能未实现”)而失败,这会导致对 sem_wait
的调用随后因 EBADF
(“错误的文件描述符”)而失败。
如果你添加一些错误检查,你会看到哪里出了问题:
if(sem_init(&sp, 0, 0) < 0)
fprintf(stderr, "sem_init failed: %s\n", strerror(errno));
...
if(sem_wait(&sp) < 0)
fprintf(stderr, "sem_wait failed: %s\n", strerror(errno));
您还应该调高编译器的警告级别——我绝对推荐使用 -Wall
,如果您想捕获更多可能的情况,还可以使用 -Wextra -pedantic
问题。目前,您的代码通过未能从 fun0
和 fun1
函数返回值来调用未定义的行为,-Wall
会警告你。这种错误在x86上可能不会造成明显的问题,但在IA64等其他架构上,uninitialized garbage can be deadly .
关于c++ - system() 是否在内部执行类似 sem_post 的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16432494/
假设 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 语言中锁定变量。
我是一名优秀的程序员,十分优秀!