**10.6**

1.若成功打开“foo.txt”:

-->1.1若成功打开“baz.txt”: 输出“4\n”

-->1.2若未能成功打开“baz.txt”: 输出“-1\n”

2.若未能成功打开“foo.txt”:

-->2.1若成功打开“baz.txt”: 输出“3\n”

-->2.2若未能成功打开“baz.txt”: 输出“-1\n”

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

参考:Getting Filename from file descriptor in C

10.9

这里只是模拟一下基本的操作,就是将文价描述符argv[1](3)指向“foo.txt”(STDIN_FILENO),shell实际实现肯定有许多没写到的。

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

10.10

如果有infile参数的话,将STDIN_FILENO指向该文件。

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

最新文章

  1. [NHibernate]基本配置与测试
  2. bzoj-3444 3444: 最后的晚餐(组合数学)
  3. java抽象类与接口的区别及用法
  4. Eclipse中调试技巧
  5. HDU 1671 Phone List(POJ 3630)
  6. htmlcleaner
  7. 【leetcode】3Sum Closest(middle)
  8. 负重前行的婚纱线上路 - i天下网商-最具深度的电商知识媒体
  9. oracle学习-安装卸载
  10. Bootstrap的核心——栅格系统的使用
  11. Ubuntu14.04上安装Composer
  12. T470p VS 2017 上运行 VS 2015 + Qt 5.6.2 + GLSL 400
  13. 【默认加入持久化机制,防止消息丢失,v0.0.3】对RabbitMQ.Client进行一下小小的包装,绝对实用方便
  14. 定时释放Linux/CentOS缓存
  15. APP性能测试,网易Emmagee工具
  16. IOS Devices Version
  17. 文件上传—SSH框架文件上传
  18. Reusing &amp; Composing GraphQL APIs with GraphQL Bindings
  19. python 的入门
  20. 启动phpstyle Apache的80端口被win7的System PID=4的进程占用的解决方法 以及 如何在phpStyle里发布程序

热门文章

  1. 《OD Docker实战》Docker从入门到精通
  2. CF 980D Perfect Groups(数论)
  3. 清北刷题冲刺 10-28 p.m
  4. Mysql-15-mysql分布式应用
  5. [Xcode 实际操作]四、常用控件-(5)UILabel文本标签自定义文字样式
  6. RabbitMQ简介和使用
  7. 树的直径 【bzoj3363】[Usaco2004 Feb]Cow Marathon 奶牛马拉松
  8. java中的String,StringBuffrer,Stringbuilder的区别
  9. SaltStack自动化安装配置haproxy的Keepalived
  10. K 大神的博弈知识汇总