问题标签 [sus]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - POSIX/SUS 标头中的类型定义
这个问题涉及需要在 POSIX/SUS 标准的所需标头中定义的各种类型。
某些类型需要在许多头文件中定义,我想知道实现这一点的正确且合规的方法是什么。
例如,查看<time.h>
标头规范:
包含标头可能会使 <signal.h> 标头中的所有符号可见。
这很简单,<signal.h>
包含在<time.h>
.
现在怎么样:
clock_t、size_t、time_t、clockid_t和 timer_t类型应按照 <sys/types.h> 中的描述进行定义。
据我了解,这意味着我们不能简单地包含<sys/types.h>
from <time.h>
,因为这会暴露比所需更多的符号。
那么任何人都可以证实这一点吗?
包括在内会违反标准合规性<sys/types.h>
吗?
如果是这样,我认为最好的解决方案是为每种类型创建一个特定的标头,以便可以从任何地方使特定类型可见,而不必担心其他符号。
有没有其他好的解决方案?
最后一件事,C 标准中的类型呢?
POSIX/SUS 规范中的许多类型都是整数类型,可能需要具有固定宽度。
那么标准是否可以<stdint.h>
从特定标题中包含,还是会破坏合规性?
c - 如何通过 C 编程在 XMPP 上实现 ssh?
我在 linux 中编写 xmpp bot 来为我调用远程 shell。任何人都可以推断出我应该了解哪些技术来编写这个程序?
multithreading - 多个线程在单个套接字或管道上执行 poll() 或 select()
POSIX 和其他标准对多个线程同时在单个套接字或管道句柄上执行poll()
或调用的情况有何看法?select()
如果有任何数据到达,是只有一个等待线程被唤醒还是所有等待线程都被唤醒?
c++ - 如何可移植地检查 SuSv3 数据类型的极值?
SuSv3ssize_t
要求是有符号整数类型。如果我想检查我计算的值是否大于此类数据类型允许的最大值,我可以将其与 进行比较INT_MAX
,这不太好。
是否有一种更便携的方式可以完成这种比较 - 一个宏/函数f
,其工作方式如下
, 或短序列的此类操作到相同的排序?
系统:
Ubuntu 12.04。
glibc 2.15
内核 3.2.0
PS:在谷歌上搜索时,我首先认为 gcc 扩展 'typeof' 听起来很有希望;但它似乎在这里没有帮助(或者是吗?)。这就是说我对任何可能是 gcc 扩展/属性/等的东西都很好。
c - 是给定的还是假设所有 POSIX/SUS 信号都是#define?
信号在实现之间有所不同。APUE(Unix环境中的高级编程)中有一些很好的表格,例如第2版第292页的“图10.1 UNIX系统信号”。
因此,让我们以示例为例SIGWAITING
。信号在文档中显示为int
,但大多数实现似乎使用 a#define
而不是 a const int
。
但是,该标准是否规定了可以依赖信号的任何地方#define
?或者我可以基于这样一个事实假设它,例如,几乎每个现有的实现都使用#define
. 或者这完全是一个糟糕的假设?
基本原理是:如果我可以依赖#define
被使用,我可以使用它#ifdef
来隐藏不使用它的实现的更奇特的信号。对于const int
常量名称,我不知道允许做出此编译时间决定的类似机制。
c - 我可以假设 stdio 流在 dup2 之后指向正确的文件描述符吗?
我有代码,我想将一段特定的代码封装到一个分叉的孩子中,这样如果代码导致问题,它不会影响父级,并且父级将能够报告。
通话exec
后我不知道。fork
简单明了fork
,然后运行通常在父级中运行的代码。
child 中的代码将内容输出到stdout
和stderr
。由于交错输出和stdio
缓冲的问题,我现在正在研究TLPI以获得更好的解决方案。
我想出的想法大致是:
pipe()
对于每个流fork()
- 在孩子:
close()
读取管道末端dup2()
写入结束于文件描述符stdout
和stderr
分别setbuf(fd, NULL)
关闭stdio
子级内部的流缓冲。
- 在父母中:
close()
写管道的末端- 使用
select
//等pselect
(epoll
必须跨 Linux、BSD、AIX、Solaris 等运行)来观察管道的读取端是否有新数据,以及当它write()
直接到达父进程中的相应文件描述符时。
dup2
现在,我认为孩子的内在和内在之间缺少了一步setbuf
。它是什么?
setbuf
FILE*
当然需要一段dup2
时间int
。
freopen
想到了,但它需要一条路径。如果我只想为流分配一个新的文件号,我该怎么做?
c - 在父进程和子进程之间共享用于 stdio 缓冲的缓冲区是否合法?
setvbuf
我想知道为stdio流缓冲分配一个缓冲区并将其与(之前)一起使用是否合法fork
,其中缓冲区是父进程和子进程之间共享的匿名mmap
“已分配”内存块?
假设这两者是同步的,我是否可以假设结果将是理智的,或者我应该不惜一切代价避免这种情况?
c - 使用自管道,如何避免事件循环在 read() 上停止?
我正在尝试利用自管道技巧来获得我的应用程序的可移植实现(跨 Solaris、MacOSX、Linux、BSD)。
因此,除了两个管道用于获取分叉子节点stderr
的stdout
输出(我在子节点中使用 no exec
,子节点执行与父节点相同的代码)之外,我还有信号管道(enum {SIG_PIPE, STDOUT_PIPE, STDERR_PIPE, MAX_PIPE}
提供符号名称)。
O_NONBLOCK
在调用之前设置在管道上handle_child_output()
。- 孩子拥有
stderr
andstdout
管道的写端并继续使用printf()
和朋友,有效地写入每个相应的管道(setvbuf
用于关闭孩子内部的缓冲)。
接下来的代码有点长,就像一般的自管道技巧一样。已经是浓缩的形式了。所以让我试着解释一下应该发生什么以及它在哪里卡住了。
我需要收集退出状态,并且必须能够找出孩子是通过信号终止还是通过退出终止。这些情况的处理在其他地方进行。相关的是返回指向 byhandle_child_output()
内的孩子的退出代码。int
pstatus
外层do
-while
循环 inhandle_child_output()
将设置FD_SET
在select
调用中使用。它添加了信号管道读取端以及子管道的读取stderr
端stdout
。
然后if(FD_ISSET(fds[SIG_PIPE], &rd))
检查信号管道是否包含任何新内容并将其排出,处理任何潜在信号。
之后的for
循环遍历剩余的文件描述符以查看是否有任何待处理的内容,然后通过模仿它在父级各自stdio
通道上获得的内容进行处理。
第二个循环中的读取调用是它停止的地方。
症状是父母卡在读取调用中:
就好像在读取信号管道和其他管道之间存在竞争条件。在检查文件描述符时,孩子似乎已经退出,因此最终成为僵尸,因为父母仍然卡在其中read()
并且永远不会到达其中一个wait()
调用。
我究竟做错了什么?if(exitloop) break;
在循环之前添加一个for
以跳出外do
循环是否合法while
?在我看来,这可能会在管道中留下未读内容,不是吗?
linux - FUSE 的写顺序保证
write() 实现应该假设随机访问,还是可以有一些假设,比如它们将按顺序执行,并且偏移量增加?
POSIX 或 SUS 规范中描述 VFS 接口的部分的链接将获得额外积分。
c - 跨平台支持 sprintf 的 Format '-Flag
Single UNIX Specification Version 2将sprintf
's format '
-flag 行为指定为:
十进制转换结果的整数部分 (
%i
,%d
,%u
,%f
,%g
或%G
) 将被格式化为千位分组字符[ 1 ]
我在c或c++规范中找不到格式'
-flag 。g++ 甚至警告:
ISO C++11 不支持该
'
printf
标志
在 Visual C 中甚至无法识别该标志以发出警告;printf("%'d", foo)
输出:
会
我希望能够编写使用 format '
-flag 行为的符合 C 标准的代码。因此,我正在寻找以下答案之一:
- 格式
'
-flag的 C 标准规范 - gcc 格式的跨平台兼容外推
'
-flag - 证明跨平台外推是不可能的