CSAPP chap10

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);
}

运行的结果为
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值