在 APUE 第 12 章第 454 页中,提到:
为了避免错误行为,线程必须阻塞它正在等待的信号......
标准中也有类似的说法:
set定义的信号在调用sigwait()时应该被阻塞;否则,行为未定义。
这些文本中讨论了哪些错误/未定义的行为?我在标准中找不到基本原理或应用程序用法,而且我很难理解书中的解释:
如果信号没有被阻塞......,则打开一个计时窗口,其中一个信号可以在线程完成对
sigwait
.
在阅读标准时,我注意到一堆 API,
在第 5 期中引入以与 POSIX 实时 API 保持一致,
在第 6 期中标记为选项组成员,并且
在第 7 期 (SUSv4) 中移至基地。
问:这是否意味着所有符合“ Unix(R) V7 ”产品标准的系统都是实时系统?这种系统在实时要求方面的实际能力是什么?
我需要将 IO 引脚值与从用户空间写入串行端口同步(因为我还不能从内核空间做到这一点 - 请参阅我的另一个问题)。我的代码(省略错误检查)如下:
char buf[3] = {'U','U','U'};
int fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY); // supposed to be blocking
// fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_NONBLOCK); <-- makes no difference
FILE *f = fopen("/sys/class/gpio/gpio200/value", "w"); // the relevant IO
// set IO
fprintf(f, "1");
fflush(f);
// send data
write(fd, buf, sizeof(buf));
// unset IO
fprintf(f, "0");
fflush(f);
行为是 IO 在写入开始时快速切换到 1 并返回。换句话说,write()
在数据实际传输到网络之前很久就返回了。
这里有希望吗?