在系统调用的手册页中写(2) -
ssize_t write(int fd, const void *buf, size_t count);
它说如下:
回报价值
成功时,返回写入的字节数(零表示没有写入).出错时,返回-1,并
errno进行适当设置.如果count为零且文件描述符引用常规文件,则可能返回0,或者可以检测到错误.对于特殊文件,结果不可移植.
我会将此解释为意味着返回0只意味着没有任何内容被写入,无论出于何种原因.
但是,当处理作为TCP套接字的文件描述符时,UNP中的Stevens将返回值0视为致命错误(这由另一个调用exit(1)短计数的函数包装):
ssize_t /* Write "n" bytes to a descriptor. */
writen(int fd, const void *vptr, size_t n)
{
size_t nleft;
ssize_t nwritten;
const char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
if (nwritten < 0 && errno == EINTR)
nwritten = 0; /* and …Run Code Online (Sandbox Code Playgroud) 目前我有一些代码(压缩和删除一堆错误检查):
dp = readdir(dir);
if (dp->d_type == DT_DIR) {
}
Run Code Online (Sandbox Code Playgroud)
这可以在我的Linux机器上运行.但是在另一台机器上(看起来像SunOS,sparc):
SunOS HOST 5.10 Generic_127127-11 sun4u sparc SUNW,Ultra-5_10
Run Code Online (Sandbox Code Playgroud)
我在编译时遇到以下错误:
error: structure has no member named `d_type'
error: `DT_DIR' undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)
我认为dirent.h 标题是跨平台(对于POSIX机器).有什么建议.
import time
import sys
sys.stdout.write("1")
time.sleep(5)
print("2")
Run Code Online (Sandbox Code Playgroud)
将在5秒后打印"12"
import time
import sys
sys.stdout.write("1\n")
time.sleep(5)
print("2")
Run Code Online (Sandbox Code Playgroud)
将立即打印"1 \n",然后在5秒后打印"2"
为什么是这样?
Ruby /[[:punct:]]/应该匹配所有"标点字符".根据维基百科,这意味着/[\]\[!"#$%&'()*+,./:;<=>?@\^_`{|}~-]/每POSIX标准.
它匹配:-[]\;',./!@#%&*()_{}::"?.
但是,它不匹配:=`~$^+|<>(至少在红宝石1.9.3p194).
是什么赋予了?
POSIX XSH 2.8.4进程调度定义了线程和进程的调度属性的行为.所述sched_*接口被指定为影响的调度特性过程,而不是线程.这在以下段落中阐明:
POSIX模型将"进程"视为系统资源的聚合,包括可由操作系统在其控制的处理器上调度的一个或多个线程.虽然进程具有自己的一组调度属性,但它们对各个线程的调度行为具有间接影响(如果有的话),如下所述.
和
对于具有系统调度争用范围的线程,进程调度属性不应对线程或专用于该线程的底层内核调度实体的调度属性或行为产生影响.
我对此的解读是,在只支持"系统调度争用范围"的系统上(Linux/glibc就是这样一个系统),这些sched_*函数应该绝对没有可观察到的效果.
这与Linux/glibc上当前行为的实际情况相反,其中sched_*设置了特定线程的调度属性.
除了想要更好地了解这种情况外,我想我有以下几个关键问题:
有没有关于这种差异的理由的文件?
我的标准阅读是否正确?特别是,对我来说这似乎真的很令人惊讶,sched_setparam并且sched_setscheduler将被指定在单线程应用程序中没有任何效果(主线程使用默认调度策略,无法更改,以及系统争用范围).
标准sched_*功能的用处是什么?在我看来,它们对大多数实现没有影响,即使对支持进程争用范围的实现也没有影响.有人可以描述它们的预期用途吗?
通过POSIX,intmax_t指定一个有符号整数类型,能够表示任何有符号整数类型的任何值.
在C99/C11中intmax_t总是和它一样大小是否正确long long int?
对于MacOS(Mavericks),我正在制作一个shell脚本来收集随时间推移的转移统计信息dd.
手册页说:
如果dd收到SIGINFO(参见stty(1)的状态参数)信号,则当前输入和输出块计数将以与标准完成消息相同的格式写入标准错误输出.
因此,就像在Linux中一样,我试过:
kill -INFO <pid_of_dd>
Run Code Online (Sandbox Code Playgroud)
该命令成功完成,状态为0,但是dd进程连接到的终端,标准输出/标准错误中没有统计信息.
那么dd在输出中打印统计数据的正确方法是什么?
我有一个套接字编程情况,客户端关闭套接字的写入端,让服务器知道输入已完成(通过接收EOF),但保持读取结束打开以读回结果(一行文本).服务器知道客户端已成功读取结果并关闭套接字(或至少关闭读取端)将是有用的.有没有一种检查/等待这种状态的好方法?
我曾经相信它确实存在但是...我无法明确说明它.
man 3 exit并man 2 _exit详细说明了进程终止的影响,但没有提到内存泄漏.
Posix走近了:它提到了这个:
在进程被销毁之前,应该在进程中创建的内存映射取消映射.
[TYM] [Option Start]在调用进程中映射的任何类型内存块都应取消映射,就像
munmap()隐式调用它们取消映射它们一样.[选项结束]
混合这个man 3 malloc:
通常,
malloc()从堆中分配内存,并根据需要使用调整堆的大小sbrk(2).当分配大于MMAP_THRESHOLD字节的内存块时,glibcmalloc()实现将内存分配为私有匿名映射使用mmap(2).
因此,我们可以得出结论,如果malloc调用,mmap则进程终止可能会进行相应的调用munmap,但是......(a)此POSIX规范中的这个"可选功能"标记令人担忧,(b)这是mmap怎么回事sbrk?(c)Linux不是100%符合POSIX,所以我不确定是否强制将Linux文档与Posix规范混合使用
我问的原因是这个......当图书馆通话失败时,我是否可以退出?
if(somecall() == -1) {
error(EXIT_FAILURE, errno, "Big fat nasty error.\n");
}
Run Code Online (Sandbox Code Playgroud)
还是我上去栈确保一切都一路攀升到main()是free()"d和来电exit或error在main()?
前者简单得多.但是为了让前者感到轻松,我想在明确提到的文档中找到它,这不是一个错误,这样做是安全的.正如我所说的那样,事实上,文档明确提到了一些肯定会被清理的保证,但没有提到这个特定的保证让我感到不安.(这不是最常见和最明显的案例吗?首先不会提到这个吗?)