栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

C写调用和Go syscall.Write之间的区别

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C写调用和Go syscall.Write之间的区别

使用

write
,只有两种情况需要考虑:

  1. 如果失败,则结果为-1并被
    errno
    设置。
  2. 如果成功,则结果为0或更大
    errno
    且未设置。

除非您对历史上的Unix实现感兴趣,否则没有其他情况可以考虑。

write
可能返回0 的原因是因为输入缓冲区可能为空。

然而,C的手册页

write
呼叫大致介绍了
errno
可能 ,如果我们写零长度的缓冲区没有解释任何细节也可以设置,但不确定。

所有这一切意味着0长度写入可能会失败。如果失败,则返回-1并设置

errno
。如果成功,则返回0且不设置
errno
。手册页中刚刚提到了这与其他任何写入操作相同的行为,因为人们可能会惊讶地发现0长度写入可能会失败。

errno
如果
write
针对文件,非阻塞套接字或阻塞套接字的调用返回0 的状态是什么?

在这种情况下,

errno
未设置,因为
write
没有失败。仅当输入缓冲区为零字节时才会发生这种情况。

什么时候以及如何

write
调用返回0而
errno
不是0?

这不会发生。

errno
设置要么返回值为-1,要么
errno
未设置返回值为0或更大。

errno
if
write
通话返回正数的状态如何?会否定的?

errno
值将不会被设置。它的值将与
write
调用前相同。

还有其他系统调用可能会遇到相同的情况吗?

通常,系统调用将返回错误 成功。他们不会两者兼而有之。查看其他手册页的“返回值”部分,您将发现它们与大致相同

write

此代码是安全的。

func writeAll(fd int, buffer []byte) bool {    length := len(buffer)    for length > 0 {        written, err := syscall.Write(fd, buffer)        if err != nil { // here return false        }        length -= written        buffer = buffer[written:]    }    return true}

请注意,这有点多余,我们可以这样做:

func writeAll(fd int, buf []byte) bool {    for len(buf) > 0 {        n, err := syscall.Write(fd, buf)        if err != nil { return false        }        buf = buf[n:]    }    return true}

关于C的注释

从技术上讲,

write
它既是系统调用又是C函数(至少在许多系统上)。但是,C函数只是一个调用系统调用的存根。Go不会调用此存根,而是直接调用系统调用,这意味着此处不涉及C(嗯,直到您进入内核为止)。

手册页显示了C存根的调用约定和行为

write
。Go选择将其行为复制到自己的存根中
syscall.Write
。实际的系统调用本身仅具有汇编语言界面。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/573533.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号