我正在编写一个小型C应用程序,它使用一些线程来处理数据.我希望能够知道某台机器上的处理器数量,而不使用system()和小脚本.
我能想到的唯一方法是解析/ proc/cpuinfo.任何其他有用的建议?
注意:请在将此标记为重复之前阅读结尾.虽然它很相似,但我在答案中寻找的范围超出了之前的问题所要求的范围.
我倾向于认同的广泛实践往往close纯粹作为文件描述符的资源释放函数而不是具有有意义的失败案例的潜在IO操作.事实上,在解决问题529之前,POSIX在错误之后离开了文件描述符的状态(即它是否仍然被分配)未指定,使得无法以任何有意义的方式对错误进行可移植的响应.
然而,很多GNU软件都花了很大的力气来检查错误close,并且Linux手册页面的close调用失败了"这是一个常见的但仍然很严重的编程错误".NFS和配额被引用作为close可能产生错误但不提供细节的情况.
close在现实世界的系统中,哪些情况可能会失败?它们今天是否相关?我特别感兴趣的是知道是否有任何现代系统close因任何非NFS,非设备节点特定的原因而失败,以及对于NFS或与设备相关的故障,在什么条件下(例如配置)它们可能是看到.
我发现这段代码多次使用(也是类似的代码,open()而不是使用它write()).
int c = write(fd, &v, sizeof(v));
if (c == -1 && errno != EINTR) {
perror("Write to output file");
exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)
为什么要检查&& errno != EINTR这里?
寻找errno对男人,我发现关于下面的文字EINTR,但即使我参观man 7 signal不赐教.
EINTR中断函数调用(POSIX.1); 见信号(7).
我有客户端和服务器程序,现在通过TCP进行通信.我正在尝试使用POSIX消息队列(当然,在客户端和服务器位于同一台机器上的情况下).我希望它能提高性能(特别是通过减少延迟).
我已经解决了大部分问题,但我不确定一件事:如何建立"连接".服务器同时接受来自多个客户端的连接,所以我很想模仿TCP连接建立过程,如下所示:
select(2)像TCP一样使用).您可能会看到此方案与常见的TCP方法类似,这并非偶然.但是,我想知道:
请记住,之前我没有使用POSIX消息队列(我之前使用过的是IBM WebSphere MQ,但这有点不同).该平台是Linux.
我要寻找一个Java库与标准的Unix功能,即对接stat(),getpwuid(),readlink().
这曾经存在,并被称为javaunix.它于2000年发布.见本公告.但是项目页面现在已经消失了.
今天Java中这些类型的函数是否有任何现代替代品?可以让系统调用/bin/ls -l并解析输出,或编写自定义JNI方法,但这些方法比简单地使用旧javaunix库更有用.
澄清 -为了从C程序中找出文件的所有者,它应该调用stat()哪个给出所有者的UID,然后用来getpwuid()从UID获取帐户的名称.在Java中,这可以通过自定义JNI方法或javaunix使用JNI 的库来完成.
Windows 7中是否有可用的完整POSIX实现(我在考虑Windows Services for UNIX)?
它是否适用于每个版本的操作系统(似乎没有)?
它如何在以前的MS Windows POSIX实现中添加/改进或中断?
在哪里可以找到有关Windows 7中有关POSIX合规性的特定Microsoft方法和实现的更多信息?
Posix需要在端口打开时更改RTS引脚.我想要一种避免它的方法.
在Linux 3.0/C++下:
我想要一个执行以下操作的函数:
string f(string s)
{
string r = system("foo < s");
return r;
}
Run Code Online (Sandbox Code Playgroud)
显然上面的方法不起作用,但你明白了.我有一个字符串s,我想传递作为应用程序"foo"的子进程执行的标准输入,然后我想将其标准输出记录到字符串r然后返回它.
我应该使用linux系统调用或posix函数的组合?
Android POSIX兼容吗?我知道它使用Linux内核,但我不知道这意味着它是POSIX兼容的,随着越来越多的用户空间与功能POSIX标准的交易.那么,它兼容吗?
例如,如果我在C程序中仅使用ANSI和POSIX函数,它是否可以在Android上编译和运行而无需进行任何代码更改?
我目前通过3个炮弹得到2个意见:
$ bash -c 'set bar; set foo${1+ "$@"}; echo "$# $*"'
1 foobar
$ ash -c 'set bar; set foo${1+ "$@"}; echo "$# $*"'
2 foo bar
$ dash -c 'set bar; set foo${1+ "$@"}; echo "$# $*"'
2 foo bar
Run Code Online (Sandbox Code Playgroud)
或者我忽略了一些POSIX定义,它将我的示例呈现为实现定义的行为?
请注意,只有"$ @"似乎会触发差异.以下所有3个shell的工作方式相同:
$ bash -c 'set bar; set foo${1+ $*}; echo "$# $*"'
2 foo bar
$ ash -c 'set bar; set foo${1+ $*}; echo "$# $*"'
2 foo bar
$ dash -c 'set bar; set foo${1+ …Run Code Online (Sandbox Code Playgroud)