【问题标题】:Why is the flags argument in open/send/sendto/sendmsg functions a signed integer and not an unsigned integer?为什么 open/send/sendto/sendmsg 函数中的 flags 参数是有符号整数而不是无符号整数?
【发布时间】:2015-07-23 09:48:30
【问题描述】:

正如您在手册页中看到的:

   ssize_t send(int sockfd, const void *buf, size_t len, int flags);

   ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                  const struct sockaddr *dest_addr, socklen_t addrlen);

   ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

【问题讨论】:

  • 套接字 (BSD) API 早于 POSIX 和 C89。修改套接字 API 将存在中断代码,并且没有迫切需要将它们设为“无符号”。 POSIX 说文件描述符不能为负数。所以你也可以为send*() 的第一个参数做同样的参数。我怀疑原因是“历史性的”(可能只是任意选择)。

标签: c linux posix


【解决方案1】:

由于没有理由从标志中添加/减去标志,也没有理由将其转换为任何其他类型,并且对标志进行的唯一操作是按位运算符设置标志位或测试一个或多个位是否具有已设置,没有理由将其定义为有符号或无符号。两者都会好的。

【讨论】:

  • int 总是有符号的,所以它定义为有符号的!
  • @undeifned-behavior,这就是我所说的“签名”,而不是signed
  • @undefinedbehaviour:是的,但答案是没有特别需要对其进行签名。当然必须是其中之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2011-08-10
  • 2017-12-26
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多