chap10 系统级I/O
一、老师一直说让我们使用命令ls -l看能得到什么,今天终于去看了
drwxrwxrwx
- 第一位是表示文件类型。d是目录文件,l是链接文件,-是普通文件;
- 第2-4位是表示这个文件的自己拥有的权限,r是读,w是写,x是执行;
- 第5-7位是表示和这个文件在同一组的用户所具有的权限;
- 第8-10位是表示其他用户所具有的权限。
例如-rw-------,说明这个文件的类型是普通文件,这个文件的用户拥有可读可写的权限,但是没有执行的权限,它的同组用户以及其他用户一个权限都没有;
再如dr-xr-xr-x,这个文件是目录文件,这个文件的用户拥有可读可执行的权限,但是没有写的权限,它的同组用户以及其他用户的权限与它一样。
二、老师给的代码
1.ffiles1
#include "csapp.h"
int main(int argc, char *argv[])
{
int fd1, fd2, fd3;
char c1, c2, c3;
char *fname = argv[1];
fd1 = Open(fname, O_RDONLY, 0);
fd2 = Open(fname, O_RDONLY, 0);
fd3 = Open(fname, O_RDONLY, 0);
dup2(fd2, fd3);
Read(fd1, &c1, 1);
Read(fd2, &c2, 1);
Read(fd3, &c3, 1);
printf("c1 = %c, c2 = %c, c3 = %c\n", c1, c2, c3);
Close(fd1);
Close(fd2);
Close(fd3);
return 0;
}
输入命令gcc ffiles1.c csapp.h csapp.c -lpthread -o ffiles1以及 ./ffiles1 abcde.txt
得到的结果为
2.ffiles2
#include "csapp.h"
int main(int argc, char *argv[])
{
int fd1;
int s = getpid() & 0x1;
char c1, c2;
char *fname = argv[1];
fd1 = Open(fname, O_RDONLY, 0);
Read(fd1, &c1, 1);
if (fork()) {
/* Parent */
sleep(s);
Read(fd1, &c2, 1);
printf("Parent: c1 = %c, c2 = %c\n", c1, c2);
} else {
/* Child */
sleep(1-s);
Read(fd1, &c2, 1);
printf("Child: c1 = %c, c2 = %c\n", c1, c2);
}
return 0;
}
运行结果为
ps后的结果
3.ffiles3
#include "csapp.h"
int main(int argc, char *argv[])
{
int fd1, fd2, fd3;
char *fname = argv[1];
fd1 = Open(fname, O_CREAT|O_TRUNC|O_RDWR, S_IRUSR|S_IWUSR);
Write(fd1, "pqrs", 4);
fd3 = Open(fname, O_APPEND|O_WRONLY, 0);
Write(fd3, "jklmn", 5);
fd2 = dup(fd1); /* Allocates new descriptor */
Write(fd2, "wxyz", 4);
Write(fd3, "ef", 2);
Close(fd1);
Close(fd2);
Close(fd3);
return 0;
}
运行后的结果为
可以看到这个程序已经将abcde.txt文件的内容写成了pqrswxyznef
4.cpstdin
/* $begin cpstdin */
#include "csapp.h"
int main(void)
{
char c;
while(Read(STDIN_FILENO, &c, 1) != 0)
Write(STDOUT_FILENO, &c, 1);
exit(0);
}
运行的结果为