深入理解计算机系统(第二版) 家庭作业 第十章


10.6
输出 fd2 = 4 
已经有0 1 2被打开,fd1是3,fd2是4,关闭fd2之后再打开,还是4。


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


10.8
只需要将stat那句话改为: fstat(atoi(argv[1]), &stat);
当然,如果需要加其他处理的话(比如判断参数对错,fd是否存在等等),还需要添加一些语句。


10.9
这里应该是表明,输入重定向到了foo.txt,然而3这个描述符是不存在的。
说明foo.txt并没有单独的描述符3。
所以Shell执行的代码应该是这样的:
if (Fork() == 0) {/* Child */
    int fd = open("foo.txt", O_RDONLY, 0);
    dup2(fd, 1);
    close(fd);
    Execve("fstatcheck", argv, envp);


10.10
这里使用一个重定向的技术即可。如果参数个数为2,那么就将标准输入重定向到文件。
程序并没有检测各种错误。
int main(int argc, char **argv)
{
    int n;
    rio_t rio;
    char buf[MAXLINE];
    
    if(argc == 2){
        int fd = open(argv[2], O_RDONLY, 0);
        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);
}  




你可能感兴趣的:(深入理解计算机系统(第二版) 家庭作业 第十章)