c语言syscall函数,C写调用和Go syscall.Write之间的区别
小编典典
使用write,只有两种情况需要考虑:
如果失败,则结果为-1并被errno设置。
如果成功,则结果为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或更大。
errnoif 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。实际的系统调用本身仅具有汇编语言界面。
2020-07-02
c语言syscall函数,C写调用和Go syscall.Write之间的区别相关推荐
- 求222222c语言递归函数,C语言ch函数的嵌套调用和递归调用.pptx
C语言ch函数的嵌套调用和递归调用.pptx 2012/10/221 上一节我们学到了 n函数的定义 n形参 n函数的声明 n函数的调用 n实参 n函数的调用过程 n局部变量(包括形参)何时分配内容. ...
- 在c语言中允许函数递归调用,c语言允许函数的递归调用吗
c语言允许函数的递归调用吗 允许.C语言中的函数直接或间接调用自己的过程叫递归. 一.递归的两个必要条件 1.存在限制条件,当满足这个条件时,递归便不再继续. 2.每次递归调用之后越来越接近这个限制条 ...
- C语言丨函数的递归调用和递归函数
目录 前言 一.从阶乘引入 二.递归模板 1.递归函数模板 2.举例分析 三.从数学归纳法理解递归 四.更多递归实例 1.用递归方法编程计算Fibonacci数列 题目分析 程序 2.汉诺塔(Hano ...
- C语言用函数指针变量调用函数
一.用函数指针变量调用函数 一个函数,在编译的时候 ,系统会给这个函数分配一个入口地址,这个入口地址就称为函数的指针(地址).既然有地址,那么我们可以定义一个指针变量指向该函数,然后,我们就可以通过该 ...
- c语言复习--函数的递归调用
当一个程序自己调用自己时,就形成了递归现象.(可参照数学中阶乘的运算,每一步都需要前一步的值) 函数A直接调用函数A为直接递归,函数A调用函数B,函数B又调用函数A,称为间接递归. 写递归程序的关键在 ...
- C语言:函数的递归调用
函数的递归调用:一个函数在它的函数体内,直接或者间接地调用了他本身. 直接递归调用:函数直接调用自身. 间接递归调用:函数间接调用自身. 如下 ...
- 【C语言】函数嵌套的调用 函数递归调用
一.两种函数调用的方法. 1.可以嵌套调用函数在调用一个函数的过程中,又调用另一个函数. 例:add(add(a,b),c); 2.可以在函数的定义中调用另一个函数. //加函数 int ...
- matlab调用c语言驱动函数,[转载]Matlab调用C语言函数
3.3000 要得出以上的结果,那应该怎样做呢? 解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便.MEX文件是由原C代码加上MEX文件专用的接口函数后 ...
- c语言子函数定义与调用,C语言的简单函数定义与调用
#include int main() { void print_star();//声明print_star函数 print_star();//调用print_star函数 void print_me ...
最新文章
- Linux 启动失败 磁盘阵列,组建RAID5重启系统,出现md127的解决办法
- 力扣——206.反转链表
- ubuntu安装mysql_如何在Ubuntu14.04中安装mysql
- 百度AI语音语义一体化技术 识别的同时进行语义分析
- 递归问题学习二之卡牌组合问题
- linux+多个字符分割字符串数组中,怎样通过特定的分隔符将字符串分割成数组
- avl cruise与matlab,AVL CRUISE下载,AVL CRUISE购买,AVL CRUISE试用,AVL CRUISE介绍,AVL CRUISE评价...
- WinRAR软件注册的方法介绍
- sequel pro 格式化sql
- java 视频比特率_java – 为MediaCodec设置的有效比特率是多少
- SpringBoot整合银联支付
- OneR算法的Python简单实现
- 图像处理/计算机视觉/python环境下如何用滤波器、算法恢复图片,对图片去污【附代码】
- Java| MANIFEST.MF讲解
- Android--CoordinatorLayout源码分析及NestedScrolling机制
- 阿里云ECS每天一件事D1:配置SSH
- 从科学的开放精神来看开源
- python列表自定义顺序排序
- FX3U PLC源代码,stm32芯片。 全套硬件,软件源码,可以直接用GX Works2编程直接写入。 带读保护版本
- nvm 下载安装及相关命令