Linux write系统调用问题(对齐问题)
来源:互联网 发布:js input file对象 编辑:程序博客网 时间:2024/05/15 11:26
最近在学习Linux C 编程,碰到一个疑问
程序1:
程序1:
#include <unistd.h>#include <stdlib.h>int main() { if ((write(1, "Here is some data\n", 18)) != 18) write(2, "A error has occured on file descriptior 1\n", 42); exit(0);}
编译后在终端中运行,运行结果是输出(即将内容写入到标准输出流中)了"Here is some data"。如果稍微改变一下write的实参值,将第一个write函数的第三个参数改为17,运行结果如下: Here is some data A error has occured on file descriptior 1将18改为20,在终端中运行的结果为: Here is some data A error has occured on file descriptior 1
此程序没有疑问。
程序2:
#include <unistd.h>#include <stdlib.h>#include <stdio.h>int main() { int nb; nb = (int)write(1, "Here is some\n", 18); if (nb != 18) write(2, "A error has occured on file descriptior 1\n", 42); printf("\nThe value returned by the function write is %d\n", nb); exit(0);}
编译运行后的结果为:
Here is some
A
The value returned by function write is 18
程序2运行后,第二行为什么会输出一个A ? 这个A明显是if语句块里的那个write函数的结果。如果nb的值确实是18,那么按理来说,if语句就不会执行,就不会有这个A;如果nb的值不是18,那么按理第二行应该输出:A error has occured on file descriptior 1\n。
原因分析如下:
常量字符串按顺序存储在常量区域的.
"Here is some\n"
"A error has occured on file descriptior 1\n"
这两个常量字符串的地址是紧挨着的, 当第一个字符串的访问越界后就访问到第二个字符串了.
考虑下对齐, 指针的地址通常需要是 32 位对齐, 也就是 4 的倍数. 所以前面的 14 个字符会被多填充两个 0 来对齐到 16 个字节. 在加上后面的 A 和一个空格, 刚好 18 个.
- Linux write系统调用问题(对齐问题)
- write调用-linux系统编程
- Linux的系统调用问题
- Linux 字节对齐问题
- linux 对齐问题总结
- linux下系统调用write过程
- linux中的read和write系统调用
- Linux C 系统调用的问题
- 汇编语言调用Linux系统调用read和write
- write、read系统调用
- 系统调用 5--write
- 系统调用 write
- Linux文件编程之【系统调用】——write()
- Linux VFS中write系统调用实现原理
- 驱动函数write-linux系统调用如何实现
- LDD chapter3:write的奥秘-linux系统调用如何实现?
- write的奥秘-linux系统调用如何实现?
- Linux VFS 之 write/read系统调用(kernel 3.4)
- CSDN博客专栏文章批量下载脚本[python实现]
- Funny Funny Game(数学题)
- 将整数nSum拆分成num个数的和的形式——阿里巴巴笔试题
- [黑马] 第1天 --笔记篇--Swing界面 开山篇
- AGAL指令说明
- Linux write系统调用问题(对齐问题)
- java mail 发送邮件
- 【原创】PHP超时处理全面总结
- 吉他第十课
- oracle的commit
- C#常用String.Format
- C语言位运算
- 【编程珠玑】鸟瞰 --- 编程珠玑 (2012.8.7)
- 轻松解决JTable排序问题