实验代码下载地址
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
![](https://img-blog.csdnimg.cn/20210518233744970.png#pic_center?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BvcDU0MTExMQ==,size_16,color_FFFFFF,t_70)
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使用率
![](https://img-blog.csdnimg.cn/20210519001553191.png#pic_center?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BvcDU0MTExMQ==,size_16,color_FFFFFF,t_70)
- 使用系统调用会影响系统的性能,会涉及到执行代码在到内核态的切换。库调用则是在用户空间上。
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)