CSAPP 第三版 第十章 家庭作业and so on

CSAPP 第三版 第十章 作业
自己做的 仅供参考 可能出现错误

注: 10.7之后 mark一下,寒假补坑,学校只教了一点,近期又在复习……于是直接照搬了学长的答案

https://www.cnblogs.com/liqiuhao/p/8305036.html

10.6

1.  若能成功打开"foo.txt"
1.1 若能成功打开"baz.txt"
4

1.2 若不能打开"baz.txt"
-1

2.  若不能成功打开"foo.txt"
2.1 若能成功打开"baz.txt"
3

2.2 若不能成功打开"baz.txt"
-1

10.7

#include "csapp.h"

int main(int argc, char **argv) 
{
    int n;
    rio_t rio;
    char buf[MAXBUF];

    Rio_readinitb(&rio, STDIN_FILENO);
    while((n = Rio_readnb(&rio, buf, MAXBUF)) != 0) 
        Rio_writen(STDOUT_FILENO, buf, n);
    exit(0);
}

10.8

#include "csapp.h"
#include "csapp.c"
#include <string.h>
#include <stdio.h>

int main (int argc, char **argv) 
{
    struct stat stat;
    char *type, *readok;
    char buf[MAXBUF];
    char filename[MAXBUF];
    memset(buf, 0, MAXBUF);
    memset(filename, 0, MAXBUF);

    if (argc != 2)  {
    fprintf(stderr, "usage: %s <descriptor number>\n", argv[0]);
    exit(0);
    }
         
    sprintf(buf+sprintf(buf, "/proc/self/fd/"), argv[1]);

    if(readlink(buf, filename, sizeof(filename)) == -1)
    {
        fprintf(stderr, "bad file descriptor\n");
        exit(EXIT_FAILURE);
    }

    Stat(filename, &stat);
    if (S_ISREG(stat.st_mode))     /* Determine file type */
    type = "regular";
    else if (S_ISDIR(stat.st_mode))
    type = "directory";
    else 
    type = "other";
    if ((stat.st_mode & S_IRUSR)) /* Check read access */
    readok = "yes";
    else
    readok = "no";

    printf("type: %s, read: %s\n", type, readok);
    exit(0);
}

10.8

if (Fork() == 0){ /* child */
  dup2(STDIN_FILENO, atoi(argv[1]));
  Execve("fstatcheck", argv, envp);
}

10.9

#include "csapp.h"

int main(int argc, char **argv) 
{
    int n;
    rio_t rio;
    char buf[MAXLINE];

    if (argc == 2) /* infile */
    {
        int fd = open(argv[1], O_RDONLY|O_CREAT);
        dup2(fd, STDIN_FILENO);
        close(fd);
    }

    Rio_readinitb(&rio, STDIN_FILENO);
    while((n = Rio_readlineb(&rio, buf, MAXLINE)) != 0) 
        Rio_writen(STDOUT_FILENO, buf, n);

    exit(0);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值