问题标签 [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.

0 投票
2 回答
366 浏览

c - POSIX/SUS 标头中的类型定义

这个问题涉及需要在 POSIX/SUS 标准的所需标头中定义的各种类型。

某些类型需要在许多头文件中定义,我想知道实现这一点的正确且合规的方法是什么。

例如,查看<time.h>标头规范:

包含标头可能会使 <signal.h> 标头中的所有符号可见。

这很简单,<signal.h>包含在<time.h>.

现在怎么样:

clock_tsize_ttime_tclockid_ttimer_t类型应按照 <sys/types.h> 中的描述进行定义。

据我了解,这意味着我们不能简单地包含<sys/types.h>from <time.h>,因为这会暴露比所需更多的符号。

那么任何人都可以证实这一点吗?
包括在内会违反标准合规性<sys/types.h>吗?

如果是这样,我认为最好的解决方案是为每种类型创建一个特定的标头,以便可以从任何地方使特定类型可见,而不必担心其他符号。
有没有其他好的解决方案?

最后一件事,C 标准中的类型呢?
POSIX/SUS 规范中的许多类型都是整数类型,可能需要具有固定宽度。

那么标准是否可以<stdint.h>从特定标题中包含,还是会破坏合规性?

0 投票
1 回答
553 浏览

c - 如何通过 C 编程在 XMPP 上实现 ssh?

我在 linux 中编写 xmpp bot 来为我调用远程 shell。任何人都可以推断出我应该了解哪些技术来编写这个程序?

0 投票
4 回答
15950 浏览

multithreading - 多个线程在单个套接字或管道上执行 poll() 或 select()

POSIX 和其他标准对多个线程同时在单个套接字或管道句柄上执行poll()或调用的情况有何看法?select()

如果有任何数据到达,是只有一个等待线程被唤醒还是所有等待线程都被唤醒?

0 投票
1 回答
112 浏览

c++ - 如何可移植地检查 SuSv3 数据类型的极值?

SuSv3ssize_t要求是有符号整数类型。如果我想检查我计算的值是否大于此类数据类型允许的最大值,我可以将其与 进行比较INT_MAX,这不太好。

是否有一种更便携的方式可以完成这种比较 - 一个宏/函数f,其工作方式如下

, 或短序列的此类操作到相同的排序?

系统:
Ubuntu 12.04。
glibc 2.15
内核 3.2.0

PS:在谷歌上搜索时,我首先认为 gcc 扩展 'typeof' 听起来很有希望;但它似乎在这里没有帮助(或者是吗?)。这就是说我对任何可能是 gcc 扩展/属性/等的东西都很好。

0 投票
1 回答
67 浏览

c - 是给定的还是假设所有 POSIX/SUS 信号都是#define?

信号在实现之间有所不同。APUE(Unix环境中的高级编程)中有一些很好的表格,例如第2版第292页的“图10.1 UNIX系统信号”。

因此,让我们以示例为例SIGWAITING。信号在文档中显示为int,但大多数实现似乎使用 a#define而不是 a const int

但是,该标准是否规定了可以依赖信号的任何地方#define?或者我可以基于这样一个事实假设它,例如,几乎每个现有的实现都使用#define. 或者这完全是一个糟糕的假设?

基本原理是:如果我可以依赖#define被使用,我可以使用它#ifdef来隐藏不使用它的实现的更奇特的信号。对于const int常量名称,我不知道允许做出此编译时间决定的类似机制。

0 投票
1 回答
235 浏览

c - 我可以假设 stdio 流在 dup2 之后指向正确的文件描述符吗?

我有代码,我想将一段特定的代码封装到一个分叉的孩子中,这样如果代码导致问题,它不会影响父级,并且父级将能够报告。

通话exec后我不知道。fork简单明了fork,然后运行通常在父级中运行的代码。

child 中的代码将内容输出到stdoutstderr。由于交错输出和stdio缓冲的问题,我现在正在研究TLPI以获得更好的解决方案。

我想出的想法大致是:

  • pipe()对于每个流
  • fork()
  • 在孩子:
    • close()读取管道末端
    • dup2()写入结束于文件描述符stdoutstderr分别
    • setbuf(fd, NULL)关闭stdio子级内部的流缓冲。
  • 在父母中:
    • close()写管道的末端
    • 使用select//等pselectepoll必须跨 Linux、BSD、AIX、Solaris 等运行)来观察管道的读取端是否有新数据,以及当它write()直接到达父进程中的相应文件描述符时。

dup2现在,我认为孩子的内在和内在之​​间缺少了一步setbuf。它是什么?

setbufFILE*当然需要一段dup2时间int

freopen想到了,但它需要一条路径。如果我只想为流分配一个新的文件号,我该怎么做?

0 投票
2 回答
105 浏览

c - 在父进程和子进程之间共享用于 stdio 缓冲的缓冲区是否合法?

setvbuf我想知道为stdio流缓冲分配一个缓冲区并将其与(之前)一起使用是否合法fork,其中缓冲区是父进程和子进程之间共享的匿名mmap“已分配”内存块?

假设这两者是同步的,我是否可以假设结果将是理智的,或者我应该不惜一切代价避免这种情况?

0 投票
0 回答
1975 浏览

c - 使用自管道,如何避免事件循环在 read() 上停止?

我正在尝试利用自管道技巧来获得我的应用程序的可移植实现(跨 Solaris、MacOSX、Linux、BSD)。

因此,除了两个管道用于获取分叉子节点stderrstdout输出(我在子节点中使用 no exec,子节点执行与父节点相同的代码)之外,我还有信号管道(enum {SIG_PIPE, STDOUT_PIPE, STDERR_PIPE, MAX_PIPE}提供符号名称)。

  • O_NONBLOCK在调用之前设置在管道上handle_child_output()
  • 孩子拥有stderrandstdout管道的写端并继续使用printf()和朋友,有效地写入每个相应的管道(setvbuf用于关闭孩子内部的缓冲)。

接下来的代码有点长,就像一般的自管道技巧一样。已经是浓缩的形式了。所以让我试着解释一下应该发生什么以及它在哪里卡住了。

需要收集退出状态,并且必须能够找出孩子是通过信号终止还是通过退出终止。这些情况的处理在其他地方进行。相关的是返回指向 byhandle_child_output()内的孩子的退出代码。intpstatus

外层do-while循环 inhandle_child_output()将设置FD_SETselect调用中使用。它添加了信号管道读取端以及子管道的读取stderrstdout

然后if(FD_ISSET(fds[SIG_PIPE], &rd))检查信号管道是否包含任何新内容并将其排出,处理任何潜在信号。

之后的for循环遍历剩余的文件描述符以查看是否有任何待处理的内容,然后通过模仿它在父级各自stdio通道上获得的内容进行处理。

第二个循环中的读取调用是它停止的地方。

症状是父母卡在读取调用中:

就好像在读取信号管道和其他管道之间存在竞争条件。在检查文件描述符时,孩子似乎已经退出,因此最终成为僵尸,因为父母仍然卡在其中read()并且永远不会到达其中一个wait()调用。

我究竟做错了什么?if(exitloop) break;在循环之前添加一个for以跳出外do循环是否合法while?在我看来,这可能会在管道中留下未读内容,不是吗?


0 投票
2 回答
684 浏览

linux - FUSE 的写顺序保证

write() 实现应该假设随机访问,还是可以有一些假设,比如它们将按顺序执行,并且偏移量增加?

POSIX 或 SUS 规范中描述 VFS 接口的部分的链接将获得额外积分。

0 投票
1 回答
537 浏览

c - 跨平台支持 sprintf 的 Format '-Flag

Single UNIX Specification Version 2sprintf's format '-flag 行为指定为:

十进制转换结果的整数部分 ( %i, %d, %u, %f,%g%G) 将被格式化为千位分组字符[ 1 ]

规范中找不到格式'-flag 。g++ 甚至警告

ISO C++11 不支持该' printf标志

在 Visual C 中甚至无法识别该标志以发出警告;printf("%'d", foo)输出

我希望能够编写使用 format '-flag 行为的符合 C 标准的代码。因此,我正在寻找以下答案之一:

  1. 格式'-flag的 C 标准规范
  2. gcc 格式的跨平台兼容外推'-flag
  3. 证明跨平台外推是不可能的