系统级I/O


实验代码下载地址
http://csapp.cs.cmu.edu/3e/code.html
http://csapp.cs.cmu.edu/public/code.html

数据类型 size_t 	unsigned int
 ssize_t	int
open()函数

open建立了一条到文件或设备的访问路径,调用成功则返回一个被read、write和其他系统调用使用的文件描述符。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
上述头文件/usr/include,gcc的默认头文件目录
int open(const char *path,int oflags,mode_t mode);
mode是标志位按拉或后得到的,并且标志头文件sys/stat.h中定义
>name表示将输出重定向到文件名。
>&umber表示将输出重定向到文件描述符号。

3>&1 1>&2 2>&3

创建一个新的fd 3并将其指向fd 1
将文件描述符1重定向到文件描述符2。如果我们不将文件描述符保存到3中,我们将失去目标。
将文件描述符2重定向到文件描述符3。现在切换文件描述符1和2。
现在,如果程序将某些内容打印到文件描述符1,它将被打印到文件描述符2,反之亦然。

3>&1 1>&2 2>&3,它交换了stdout和stderr

main:main.o csapp.o
        gcc -o main main.o csapp.o   -lpthread
csapp.o:csapp.c 
        gcc -c  -l ./csapp.h  csapp.c 
main.o:main.c 
        gcc -c -l ./csapp.h  main.c
clean:
        rm -f *.o
 SUSv3规定,open 函数总是返回最低的`未`打开的描述符
 fd2 = Open("baz.txt", O_RDONLY, 0);				
    printf("fd2 = %d\n", fd2);					#fd2=3

在语言运行时系统均提供执行I/O的较高级别的工具。例如ANSI C提供的标准I/O库。标准IO是库函数,则在unix/linux下的底层的文件I/O则是系统调用,这里的库函数即是对系统调用的一种封装。

[tom@suse-tom chapter03]$dd if=/dev/zero of=file.in bs=1024 count=0 seek=1024    
0+0 records in
0+0 records out
0 bytes copied, 0.000296045 s, 0.0 kB/s
[tom@suse-tom chapter03]$TIMEFORMAT="" time ./a.out 					#文件拷贝小程序,0.83秒完成
0.83user 3.01system 0:03.84elapsed 99%CPU (0avgtext+0avgdata 960maxresident)k
0inputs+2048outputs (0major+57minor)pagefaults 0swaps

使用TIMEFORMAT变量来重置默认的POSIX时间输出格式,POSIX时间格式不包括CPU使用率

  • 使用系统调用会影响系统的性能,会涉及到执行代码在到内核态的切换。库调用则是在用户空间上。
dup和dup2系统调用
lseek系统调用
标准输入输出
> name		表示将输出重定向到文件名。
>&number	表示将输出重定向到文件描述符号。
number<&-	关闭标准输入 
number>&-	关闭标准输出描述符number

#标准输入输出 
1>>   /tmp/dat.txt    2>> /tmp/dat.txt   等价于 &>> 
2>&1  将错误信息重定向到标准输入     
 后面再进行 less 操作可显示同一页面
(cat tom.txt ; cat ton.txt ) | less      组合多个程序的标准输出 
cat tom.txt ; cat ton.txt | less 只less到cat ton.txt的标准输入  
ls -l &>/dev/null 
$ echo Hello >foo
$exec 3<foo 4>bar			#打开文件
$ cat<&3 >&4				#共重定向标准输入到3,标准输出到4
$ exec 3<&- 4>&-				#关闭文件
$ cat bar
Hello
var=$(ec1ho test 3>&1 1>&2 2>&3)
var1=$(echo test 3>&1 1>&2 2>&3)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值