标签: posix

C中写入(2)的返回值是0是错误吗?

在系统调用的手册页中写(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)

c linux posix tcp

13
推荐指数
2
解决办法
8404
查看次数

跨平台测试文件是否是目录的方式

目前我有一些代码(压缩和删除一堆错误检查):

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机器).有什么建议.

unix posix system-calls dirent.h

13
推荐指数
1
解决办法
6689
查看次数

在Python中,为什么没有换行就不能打印?

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"

为什么是这样?

python posix

13
推荐指数
3
解决办法
2784
查看次数

为什么Ruby/[[:punct:]] /会遗漏一些标点字符?

Ruby /[[:punct:]]/应该匹配所有"标点字符".根据维基百科,这意味着/[\]\[!"#$%&'()*+,./:;<=>?@\^_`{|}~-]/每POSIX标准.

它匹配:-[]\;',./!@#%&*()_{}::"?.

但是,它匹配:=`~$^+|<>(至少在红宝石1.9.3p194).

是什么赋予了?

ruby regex posix

13
推荐指数
1
解决办法
7099
查看次数

为什么struct stat中的st_size字段已签名?

st_size定义为一个off_t.

off_t定义为有符号整数类型.

为什么st_size定义为签名类型?这可能是消极的吗?如果它是负面的是什么意思?

c unix linux posix

13
推荐指数
2
解决办法
7050
查看次数

了解POSIX和Linux/glibc sched_*函数之间的差异

POSIX XSH 2.8.4进程调度定义了线程和进程的调度属性的行为.所述sched_*接口被指定为影响的调度特性过程,而不是线程.这在以下段落中阐明:

POSIX模型将"进程"视为系统资源的聚合,包括可由操作系统在其控制的处理器上调度的一个或多个线程.虽然进程具有自己的一组调度属性,但它们对各个线程的调度行为具有间接影响(如果有的话),如下所述.

对于具有系统调度争用范围的线程,进程调度属性不应对线程或专用于该线程的底层内核调度实体的调度属性或行为产生影响.

我对此的解读是,在只支持"系统调度争用范围"的系统上(Linux/glibc就是这样一个系统),这些sched_*函数应该绝对没有可观察到的效果.

这与Linux/glibc上当前行为的实际情况相反,其中sched_*设置了特定线程的调度属性.

除了想要更好地了解这种情况外,我想我有以下几个关键问题:

  1. 有没有关于这种差异的理由的文件?

  2. 我的标准阅读是否正确?特别是,对我来说这似乎真的很令人惊讶,sched_setparam并且sched_setscheduler将被指定在单线程应用程序中没有任何效果(主线程使用默认调度策略,无法更改,以及系统争用范围).

  3. 标准sched_*功能的用处是什么?在我看来,它们对大多数实现没有影响,即使对支持进程争用范围的实现也没有影响.有人可以描述它们的预期用途吗?

c linux posix scheduling

13
推荐指数
1
解决办法
754
查看次数

intmax_t与long long int相同吗?

通过POSIX,intmax_t指定一个有符号整数类型,能够表示任何有符号整数类型的任何值.

在C99/C11中intmax_t总是和它一样大小是否正确long long int

c posix

13
推荐指数
2
解决办法
1万
查看次数

如何让dd在MacOS中打印传输统计数据?

对于MacOS(Mavericks),我正在制作一个shell脚本来收集随时间推移的转移统计信息dd.

手册页说:

如果dd收到SIGINFO(参见stty(1)的状态参数)信号,则当前输入和输出块计数将以与标准完成消息相同的格式写入标准错误输出.

因此,就像在Linux中一样,我试过:

kill -INFO <pid_of_dd>
Run Code Online (Sandbox Code Playgroud)

该命令成功完成,状态为0,但是dd进程连接到的终端,标准输出/标准错误中没有统计信息.

那么dd在输出中打印统计数据的正确方法是什么?

macos shell posix signals

13
推荐指数
2
解决办法
8562
查看次数

确定对等体是否已关闭套接字的读取结束

我有一个套接字编程情况,客户端关闭套接字的写入端,让服务器知道输入已完成(通过接收EOF),但保持读取结束打开以读回结果(一行文本).服务器知道客户端已成功读取结果并关闭套接字(或至少关闭读取端)将是有用的.有没有一种检查/等待这种状态的好方法?

c sockets posix

13
推荐指数
2
解决办法
718
查看次数

Linux是否保证在程序退出时释放malloc'd不同的内存?

我曾经相信它确实存在但是...我无法明确说明它.

man 3 exitman 2 _exit详细说明了进程终止的影响,但没有提到内存泄漏.

Posix走近了:它提到了这个:

  • 在进程被销毁之前,应该在进程中创建的内存映射取消映射.

  • [TYM] [Option Start]在调用进程中映射的任何类型内存块都应取消映射,就像munmap()隐式调用它们取消映射它们一样.[选项结束]

混合这个man 3 malloc:

通常,malloc()从堆中分配内存,并根据需要使用调整堆的大小sbrk(2).当分配大于MMAP_THRESHOLD字节的内存块时,glibc malloc()实现将内存分配为私有匿名映射使用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和来电exiterrormain()

前者简单得多.但是为了让前者感到轻松,我想在明确提到的文档中找到它,这不是一个错误,这样做是安全的.正如我所说的那样,事实上,文档明确提到了一些肯定会被清理的保证,但没有提到这个特定的保证让我感到不安.(这不是最常见和最明显的案例吗?首先不会提到这个吗?)

malloc posix memory-leaks terminate language-lawyer

13
推荐指数
2
解决办法
412
查看次数