我使用pthread_create(&thread1, &attrs, //... , //...);并需要一些条件发生需要杀死这个线程如何杀死这个?
我不是C++开发人员,但我一直对编译器感兴趣,而且我对修改一些GCC(特别是LLVM)感兴趣.
在Windows上,GCC需要POSIX仿真层(cygwin或MinGW)才能正常运行.
这是为什么?
我使用许多其他软件,用C++编写并交叉编译用于不同的平台(Subversion,Firefox,Apache,MySQL),并且它们都不需要cygwin或MinGW.
我对C++最佳实践编程的理解是,您可以编写合理的平台中立代码,并在编译过程中处理所有差异.
那么GCC的交易是什么?为什么它不能在Windows上本机运行?
编辑:
好的,到目前为止,这两个回复说,"GCC使用posix层,因为它使用了posix标题".
但这并没有真正回答这个问题.
假设我已经为我最喜欢的标准库提供了一组标题.为什么我仍然需要posix标题?
GCC是否要求cygwin/mingw实际运行?
或者它只需要头部和库的仿真层?如果是这样,为什么我不能只给它一个带有所需资源的"lib"目录?
再次编辑:
好的,我会再次尝试澄清这个问题......
我还用D编程语言编写代码.官方编译器名为"dmd",Windows和Linux都有官方编译器二进制文件.
Windows版本不需要任何类型的POSIX仿真.Linux版本不需要任何类型的Win32仿真.如果编译器对其环境有假设,那么它很好地隐藏了这些假设.
当然,我必须告诉编译器在哪里找到标准库以及在哪里找到静态或动态链接的库.
相比之下,GCC坚持假装它在posix环境中运行,它要求ME通过设置仿真层来幽默这些假设.
但是,GCC内部究竟依赖于那层?它只是在寻找stdlib头,它假设它会在"/ usr/lib"中找到那些头文件吗?
如果是这种情况,我不应该只是告诉它查看"C:/ gcc/lib"来查找这些头文件吗?
或者GCC本身是否依赖POSIX库来访问文件系统(并做其他低级别的东西)?如果是这样,那么我想知道为什么他们不只是静态地链接他们喜欢的Windows POSIX库.为什么要求用户设置依赖项,何时可以将这些依赖项直接构建到应用程序中?
考虑以下 C++17 代码:
#include <iostream>
int read;
int main(){
std::ios_base::sync_with_stdio(false);
std::cin >> read;
}
Run Code Online (Sandbox Code Playgroud)
它可以在使用 GCC 11.2 和 Clang 12.0.1 的Godbolt上编译并正常运行,但如果使用密钥编译,则会导致运行时错误-static。
据我了解,有一个名为 POSIX(?) 的函数read(请参阅man read(2)),因此上面的示例实际上会调用 ODR 违规,并且即使在没有-static. 如果我尝试命名变量,GCC 甚至会发出警告malloc:built-in function 'malloc' declared as non-function
上面的程序是有效的 C++17 吗?如果没有,为什么?如果是,是否是编译器错误导致其无法运行?
是否有标准调用将POSIX套接字的发送端一直刷新到远程端,还是需要将其作为用户级协议的一部分实现?我环顾了常见的标题,却找不到任何东西.
使用winsock,您可以将套接字或单独的I/O操作配置为"重叠".这意味着立即返回执行I/O的调用,而实际操作由单独的工作线程异步完成.
Winsock还提供"完成端口".据我所知,完成端口充当句柄(套接字)的多路复用器.如果句柄不在I/O操作的中间,即如果其所有I/O操作都已完成,则可以解复用句柄.
那么,关于我的问题...... linux是否支持完成端口甚至是套接字的异步I/O?
我刚刚回顾了一些非常糟糕的代码 - 通过创建一个新线程来在串行端口上发送消息的代码,以便在发送的每条消息的新线程中打包和组装消息.是的,对于创建pthread的每条消息,正确设置了位,然后线程终止.我不知道为什么有人会做这样的事情,但它提出了一个问题 - 实际创建一个线程有多少开销?
Cucumber.js提供了一个命令行"binary",它是一个.js包含shebang指令的简单文件:
#!/usr/bin/env node
var Cucumber = require('../lib/cucumber');
// ...
Run Code Online (Sandbox Code Playgroud)
package.json使用"bin"配置键指定二进制文件:
{ "name" : "cucumber"
, "description" : "The official JavaScript implementation of Cucumber."
// ...
, "bin": { "cucumber.js": "./bin/cucumber.js" }
// ...
Run Code Online (Sandbox Code Playgroud)
这一切都适用于POSIX系统.有人在Windows上运行Cucumber.js时报告了一个问题.
基本上,该.js文件似乎是通过Windows的JScript解释器(而不是Node.js)执行的,并且由于shebang指令而引发语法错误.
我的问题是:建议在UNIX和Windows系统上运行的"二进制"脚本的推荐方法是什么?
谢谢.
我可以通过/ etc/passwd grep,但这似乎很麻烦.'finger'没有安装,我想避免这种依赖.这是一个程序,所以如果有一些命令让你只是访问用户信息会很好.
如何在类UNIX系统上使用单个命令删除所有未使用的信号量和共享内存,例如Ubuntu?
是否存在将表示端点的"文件"放置到Unix域套接字的约定?
我倾向于把它们放进去/tmp/some-application-specific-subdir-name/,但我想知道是否有一个更常见的地方.
背景是,POSIX不清楚访问这些"文件" 的最大路径长度:
sun_path的大小故意未定义.这是因为不同的实现使用不同的大小.例如,4.3 BSD使用108的大小,4.4 BSD使用104的大小.由于大多数实现源自BSD版本,因此大小通常在92到108的范围内.
应用程序不应假定sun_path的特定长度或假设它可以保存{_POSIX_PATH_MAX}个字节(256).
因此,路径长度上的"限制"应该保留在应用程序的文件/路径名配置之外.