system()是否在内部执行类似sem_post的调用?
Does system() do a call like sem_post inside?
我想我的代码不会打印文本
哦,为什么来这里! 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 kernel: 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: %sn", strerror(errno));
...
if(sem_wait(&sp) < 0)
fprintf(stderr, "sem_wait failed: %sn", strerror(errno));
您还应该提高编译器上的警告级别——如果您想捕获更多可能出现的问题,我绝对推荐使用-Wall
和-Wextra -pedantic
。目前,您的代码调用未定义的行为,因为无法从fun0
和fun1
函数返回值,而-Wall
会警告您。这种错误在x86上可能不会引起任何明显的问题,但在其他架构(如IA64)上,未初始化的垃圾可能是致命的。
你的代码的问题是sem_wait(),从sem_wait手册页,它说:
"sem_wait()减少(锁定)sem指向的信号量。如果信号量的值大于零,则继续递减,函数立即返回。如果信号量当前的值为零,则调用阻塞,直到可以执行减量(即,信号量值上升到零以上),或者信号处理程序中断调用。"
在你的代码中,你用0初始化sp,当sem_wait()递减时,它阻塞并且永远不会返回,因为没有其他线程增加sp变量
- 如何使用curlpp通过POST方法上传文件和json数据
- 使用libcurl提交批量url的正确BING Api POST url是什么
- 命名空间 pqxx 无法识别 - 将 libpqxx 添加到 Windows 上的 Visual Studio Post
- 如何使用boost/beast从HTTP POST请求中解析和提取有效负载?
- 如何使用 curl 将 POST 请求从 python 重写为 C++
- 从简单的 POST 请求中解析异常
- Visual Studio 2017 中的 cpprestapi 问题找不到 POST/GET 常量
- 使用 cpp-httplib 的 POST 请求
- POST Arduino 传感器值通过 Flask API 发送到本地 Sqlite db
- C++:如何通过 curl 调用使用 HTTP post 请求发送二进制数据(protobuf 数据)
- C++中的 cURL POST 请求
- C++ Schannel POST 400 错误代码错误请求
- c++curl返回413请求实体过大,但是post大小远小于max大小
- HTTP POST 请求不允许我定义上下文类型
- 如何在c++中使用libcurl发送POST请求并接收它
- cpp libcurl 在 HTTP post 调用中发送 zip 文件,而不使用 multipart\form-da
- 使用 http post 在 FCM 中推送通知
- 我想将 POST 请求从 arduino 发送到 mysql 工作台并保存值
- 如何捕获从 MFC Web 浏览器 c++ 发出的 GET/POST 请求
- 使用 HTTP 方法 POST 或 PUT 上传数据