一本书600页,2本1000多页,好多啊 QAQ
5-1
请使用标准I/O系统调用(open和lseek)和off_t数据类型修改程序清单5-3中的程序。将宏_FILE_OFFSET_BITS的值设置为64进行编译,并测试该程序是否能够成功创建一个大文件。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int main(int argc, char *argv[])
{
int fd;
off_t off;
if (argc != 3 ||strcmp(argv[1], "--help") == 0)
{
printf("pathname or offset erroe");
_exit(0);
}
fd = open(argv[1],O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);
if(fd == -1)
{
printf("open error");
_exit(0);
}
off = atoll(argv[2]);
if(lseek(fd,off,SEEK_SET) == -1)
{
printf("lseek error");
_exit(0);
}
if(write(fd,"test",SEEK_SET) == -1)
{
printf("write error");
_exit(0);
}
}
编译运行结果好像是错的…没查出Bug,照着书上打的,应该感觉没问题 (? _ ?)
5-2
编写一个程序,使用O_APPEND标志并以写方式打开一个已存在的文件,且将文件偏移量置于文件起始处,在写入数据。数据会显示在文件中的哪个位置?为什么?
在设置了O_APPEND标志后,对打开文件的写入操作write会变成一个包含有文件偏移和写入的一个原子操作,强制在文件的结尾写入,所以在写入之前使用lseek也没有办法改变写入的位置。但是可以通过lseek在文件的任意位置读取。
5-3
编写程序,接受最多3个命令参数
$ atomic_append filename num-bytes [x]
该程序打开或创建指定文件,然后每次调用write()写入一个字节的方式,向文件结尾添加num-bytes个字节。若没有参数x,使用O_APPEND标志打开文件,否则不使用该标志打开文件。而是使用lseek(fd,0,SEEK_END)并write来追加内容。运行如下命令,解释ls -l两个文件大小的为什么不同。
1 |
|
结果
jakevin@jakevin-PC:~/Linux系统编程手册$ ./automic_append f1 1000000 & ./automic_append f1 1000000
[1] 7783
jakevin@jakevin-PC:~/Linux系统编程手册$ ./automic_append f2 1000000 x & ./automic_append f2 1000000 x
[2] 7789
[1] 已完成 ./automic_append f1 1000000
[2]+ 已完成 ./automic_append f2 1000000 x
jakevin@jakevin-PC:~/Linux系统编程手册$ ls -l f1 f2
-rw——- 1 jakevin jakevin 2000000 May 7 17:00 f1
-rw——- 1 jakevin jakevin 1000000 May 7 17:00 f2
原因书上很清楚了,类似独占文件的那个例子
5-4
使用fcntl()和close()来实现dup()和dup2()。dup2()在处理oldfd和newfd相等时,应检查oldfd是否有效,测试fcntl(oldfd, F_GETFL)是否成功就可以达到这一点。若oldfd无效,则dup2返回-1,并将errno置为EBADF。
注意点:使用fcntl()和close()来实现dup()和dup2()。务必牢记dup2()需要处理的一种特殊情况,即oldfd与newfd相等。这时,应检查oldfd是否有效,测试fcntl(oldfd, F_GETFL)是否成功就能达到这一目标。若oldfd无效,则dup2()将返回-1,并将errno置为EBADF。
1 |
|
当第二个参数cmd=F_DUPFD时,它的作用是根据filedes复制一个新文件描述符。此时,fcntl相当于dup和dup2函数。
第三个参数指出新复制的文件描述符是一个等于或大于该参数的可用文件描述符,且不能等于一个已有的文件描述符。如果第三个参数等于一个已有文件描述符,则取一个大于该参数的一个可用描述符。
DUPFD:duplicate(复制)File(文件)Description(描述)
5-5
编写一程序,验证文件描述符及其副本是否共享了文件偏移量和打开文件的状态标识。
5-6
说明下列代码中每次执行write后,输出文件的内容是什么,为什么。
1
2
3
4
5
6
7
8
9fd1 = open(file, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
fd2 = dup(fd1);
fd3 = open(file, O_RDWR);
write(fd1, "Hello,", 6);
write(fd2, " world", 6);
//这里按照答案的解释,应该是有一个空格在world前面的,书上可能是印错了
lseek(fd2, 0, SEEK_SET);
write(fd1, "HELLO,", 6);
write(fd3, "Gidday", 6);
第一次write,文件变成了Hello,,第二次写入,继续在后面加上world,注意这里应该是有一个空格的,否则最后和答案对不上。第三次write,由于偏移至头,所以第三次覆盖了第一次的6个字符,变成了HELLO, world,第四次fd3的偏移量是0,所以也是从头开始写,覆盖了第三次的HELLO变成了Gidday world
5-7
使用read()、write()、malloc()实现readv,writev函数功能。