gpt4 book ai didi

c++ - system() 是否在内部执行类似 sem_post 的调用?

转载 作者:太空狗 更新时间:2023-10-29 11:45:51 25 4
gpt4 key购买 nike

我认为我的代码不会打印文本

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问题。目前,您的代码通过未能从 fun0fun1 函数返回值来调用未定义的行为-Wall会警告你。这种错误在x86上可能不会造成明显的问题,但在IA64等其他架构上,uninitialized garbage can be deadly .

关于c++ - system() 是否在内部执行类似 sem_post 的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16432494/

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