草庐IT

ios - 为什么 mmap() 使用 MAP_FAILED 而不是 NULL?

有人知道为什么mmap()返回MAP_FAILED而不是NULL吗?在大多数系统上,MAP_FAILED似乎是(void*)-1。为什么mmap()不直接使用NULL呢?我知道地址0x0在技术上是一个有效的内存页面,而(void*)-1永远不会是一个有效的页面。然而我的猜测是mmap()实际上永远不会返回页面0x0。例如,在Windows上,VirtualAlloc()在出错时返回NULL。假设mmap()永远不会返回0x0是否安全?据推测,对mmap()的成功调用应该将可用内存返回给调用者。地址0x0永远不可用,因此它永远不会在成功时返回。在这种情况下,使用0x0作为失败标记似乎是明

ios - 为什么 mmap() 使用 MAP_FAILED 而不是 NULL?

有人知道为什么mmap()返回MAP_FAILED而不是NULL吗?在大多数系统上,MAP_FAILED似乎是(void*)-1。为什么mmap()不直接使用NULL呢?我知道地址0x0在技术上是一个有效的内存页面,而(void*)-1永远不会是一个有效的页面。然而我的猜测是mmap()实际上永远不会返回页面0x0。例如,在Windows上,VirtualAlloc()在出错时返回NULL。假设mmap()永远不会返回0x0是否安全?据推测,对mmap()的成功调用应该将可用内存返回给调用者。地址0x0永远不可用,因此它永远不会在成功时返回。在这种情况下,使用0x0作为失败标记似乎是明

c - 为什么 struct stat 中的 st_size 字段是有符号的?

st_size是defined作为off_t。off_t是defined作为有符号整数类型。为什么st_size定义为有符号类型?可以是负数吗?如果是负数是什么意思? 最佳答案 我能想到的最好的理由是避免将off_t的未签名版本作为额外类型引入;POSIX已经拥有大量具有类似用途的整数类型。除此之外,当大小不是一个有意义的概念时,能够将-1存储在st_size中可能很有用;我不确定是否有任何实现这样做,而且我找不到POSIX在哪里对st_size的内容提出任何要求,除了常规文件和符号链接(symboliclink)...

c - 为什么 struct stat 中的 st_size 字段是有符号的?

st_size是defined作为off_t。off_t是defined作为有符号整数类型。为什么st_size定义为有符号类型?可以是负数吗?如果是负数是什么意思? 最佳答案 我能想到的最好的理由是避免将off_t的未签名版本作为额外类型引入;POSIX已经拥有大量具有类似用途的整数类型。除此之外,当大小不是一个有意义的概念时,能够将-1存储在st_size中可能很有用;我不确定是否有任何实现这样做,而且我找不到POSIX在哪里对st_size的内容提出任何要求,除了常规文件和符号链接(symboliclink)...

c - C 中 write(2) 的返回值 0 是错误吗?

在系统调用的手册页中write(2)-ssize_twrite(intfd,constvoid*buf,size_tcount);内容如下:ReturnValueOnsuccess,thenumberofbyteswrittenarereturned(zeroindicatesnothingwaswritten).Onerror,-1isreturned,anderrnoissetappropriately.Ifcountiszeroandthefiledescriptorreferstoaregularfile,0maybereturned,oranerrorcouldbedetec

c - C 中 write(2) 的返回值 0 是错误吗?

在系统调用的手册页中write(2)-ssize_twrite(intfd,constvoid*buf,size_tcount);内容如下:ReturnValueOnsuccess,thenumberofbyteswrittenarereturned(zeroindicatesnothingwaswritten).Onerror,-1isreturned,anderrnoissetappropriately.Ifcountiszeroandthefiledescriptorreferstoaregularfile,0maybereturned,oranerrorcouldbedetec

c - 使用 dup2 时的竞争条件

Thismanpage对于dup2系统调用说:EBUSY(Linuxonly)Thismaybereturnedbydup2()ordup3()duringaraceconditionwithopen(2)anddup().它讨论的竞争条件是什么?如果dup2出现EBUSY错误,我该怎么办?我应该像EINTR那样重试吗? 最佳答案 在fs/file.c中有解释,do_dup2():/**Weneedtodetectattemptstododup2()overallocatedbutstill*notfinisheddescripto

c - 使用 dup2 时的竞争条件

Thismanpage对于dup2系统调用说:EBUSY(Linuxonly)Thismaybereturnedbydup2()ordup3()duringaraceconditionwithopen(2)anddup().它讨论的竞争条件是什么?如果dup2出现EBUSY错误,我该怎么办?我应该像EINTR那样重试吗? 最佳答案 在fs/file.c中有解释,do_dup2():/**Weneedtodetectattemptstododup2()overallocatedbutstill*notfinisheddescripto

c - 如何在不删除项目的情况下查看 Linux (POSIX) 消息队列?

我需要查看消息队列而不删除它们。仅当消息队列项符合特定条件时,我才会继续删除它。这个怎么做?以下是我知道的API——但似乎没有一个支持窥视。mq_close()—关闭消息队列mq_getattr()—获取消息队列的当前属性mq_notify()—当队列变为非空时通知调用进程mq_open()—打开或创建消息队列mq_receive()—从队列接收消息mq_send()—将消息放入消息队列mq_setattr()—为消息队列设置标志mq_unlink()—取消链接(即删除)消息队列有没有办法在不删除消息的情况下查看消息? 最佳答案 窥

c - 如何在不删除项目的情况下查看 Linux (POSIX) 消息队列?

我需要查看消息队列而不删除它们。仅当消息队列项符合特定条件时,我才会继续删除它。这个怎么做?以下是我知道的API——但似乎没有一个支持窥视。mq_close()—关闭消息队列mq_getattr()—获取消息队列的当前属性mq_notify()—当队列变为非空时通知调用进程mq_open()—打开或创建消息队列mq_receive()—从队列接收消息mq_send()—将消息放入消息队列mq_setattr()—为消息队列设置标志mq_unlink()—取消链接(即删除)消息队列有没有办法在不删除消息的情况下查看消息? 最佳答案 窥