《UNIX高级环境编程》读书笔记之文件与目录(3)

练习:

实现shell里面的umask命令

void get_umask(int argc,char * argv[])
{
    if(argc == 2)//get umask
    {
        mode_t mode = umask(0000);

        int user = 0,group = 0,other = 0;

        if(mode & S_IRUSR)
            user = user + 4;
        if(mode & S_IWUSR)
            user = user + 2;
        if(mode & S_IXUSR)
            user = user + 1;

        if(mode & S_IRGRP)
            group = group + 4;
        if(mode & S_IWGRP)
            group = group + 2;
        if(mode & S_IXGRP)
            group = group + 1;

        if(mode & S_IROTH)
            other = other + 4;
        if(mode & S_IWOTH)
            other = other + 2;
        if(mode & S_IXOTH)
            other = other + 1;

        umask(mode);
        printf("0%d%d%d\n",user,group,other);
    }
    else//set umask
    {
        int len = strlen(argv[2]);
        switch(len)
        {
            case 1:
            {
                int a;
                a = argv[2][0] - '0';
                mode_t mode = 0;
                if(a < 0 || a > 7)
                    {
                        printf("octal number out of range\n");
                        return ;
                    }
                if(a & 0x04)
                    mode = mode | S_IROTH;
                if(a & 0x02)
                    mode = mode | S_IWOTH;
                if(a & 0x01)
                    mode = mode | S_IXOTH;
                umask(mode);
                break;
            }
            case 2:
            {
                int a,b;
                mode_t mode = 0;
                a = argv[2][0] - '0';
                b = argv[2][1] - '0';

                if(a < 0 || a > 7 || b < 0 || b > 7)
                    {
                        printf("octal number out of range\n");
                        return ;
                    }

                if(b & 0x04)
                    mode = mode | S_IROTH;
                if(b & 0x02)
                    mode = mode | S_IWOTH;
                if(b & 0x01)
                    mode = mode | S_IXOTH;

                if(a & 0x04)
                    mode = mode | S_IRGRP;
                if(a & 0x02)
                    mode = mode | S_IWGRP;
                if(a & 0x01)
                    mode = mode | S_IXGRP;
                umask(mode);
                break;
            }
            case 3:
            {
                int a,b,c;
                mode_t mode = 0;
                a = argv[2][0];
                b = argv[2][1];
                c = argv[2][2];

                if(a < 0 || a > 7 || b < 0 || b > 7 || c < 0 || c > 7)
                    {
                        printf("octal number out of range\n");
                        return ;
                    }

                if(a & 0x04)
                    mode = mode | S_IRUSR;
                if(a & 0x02)
                    mode = mode | S_IWUSR;
                if(a & 0x01)
                    mode = mode | S_IXUSR;

                if(b & 0x04)
                    mode = mode | S_IRGRP;
                if(b & 0x02)
                    mode = mode | S_IWGRP;
                if(b & 0x01)
                    mode = mode | S_IXGRP;

                if(c & 0x04)
                    mode = mode | S_IROTH;
                if(c & 0x02)
                    mode = mode | S_IWOTH;
                if(c & 0x01)
                    mode = mode | S_IXOTH;
                umask(mode);
                break;
            }
            default:
            {
                int a,b,c,d;
                mode_t mode = 0;
                a = argv[2][len-4];
                b = argv[2][len-3];
                c = argv[2][len-2];
                d = argv[2][len-1];

                if(a != 0 || b < 0 || b > 7 || c < 0 || c > 7 || d < 0 || d >7)
                    {
                        printf("octal number out of range\n");
                        return ;
                    }

                if(b & 0x04)
                    mode = mode | S_IRUSR;
                if(b & 0x02)
                    mode = mode | S_IWUSR;
                if(b & 0x01)
                    mode = mode | S_IXUSR;

                if(c & 0x04)
                    mode = mode | S_IRGRP;
                if(c & 0x02)
                    mode = mode | S_IWGRP;
                if(c & 0x01)
                    mode = mode | S_IXGRP;

                if(d & 0x04)
                    mode = mode | S_IROTH;
                if(d & 0x02)
                    mode = mode | S_IWOTH;
                if(d & 0x01)
                    mode = mode | S_IXOTH;
                umask(mode);
                break;
            }
        }
    }

}
时间: 2024-10-24 13:57:31

《UNIX高级环境编程》读书笔记之文件与目录(3)的相关文章

Unix高级环境编程学习笔记(二):文件和目录

1 stat,fstat,lstat函数 #include<sys/stat.h> int stat (const char* restrict pathname, struct stat *restrict buf); int fstat (int filedes, struct stat * buf); int lstat (const char* restrict pathname, struct stat *restrict buf); 成功返回0,失败返回-1 stat返回pathn

《unix高级环境编程》终端 I/O——终端 IO 基本概述

终端基本概念 终端 IO 是一种字符型设备,终端特殊设备文件一般有以下几种: 串行端口终端:是使用计算机串行端口连接的设备,计算机把每个串行端口都看作是一个字符设备.串行端口所对应的设备名称 /dev/ttySn(n表示从0开始的整数): 伪终端:是成对的逻辑终端设备,例如 /dev/ptyp3 和/ dev/ttyp3(在设备文件系统中分别是 /dev/pty/m3 和/ dev/pty/s3 ),它们与实际物理设备并不直接相关: 控制终端:是当前进程的控制终端的设备特殊文件 /dev/tty

UNIX高级环境编程(3)Files And Directories - stat函数,文件类型,和各种ID

在前面的两篇,我们了解了IO操作的一些基本操作函数,包括open.read和write. 在本篇我们来学习一下文件系统的其他特性和一个文件的属性,涉及的函数功能包括: 查看文件的所有属性: 改变文件所有者: 改变文件权限: 操作文件夹. 我们还会了解一些文件系统相关的数据结构和符号链接(symbolic link). 1 函数stat.fstat.fstatat.lsat函数 #include <sys/stat.h> int stat(const char *restrict pathnam

UNIX高级环境编程(5)Files And Directories - 文件相关时间,目录文件相关操作

?1 File Times 每个文件会维护三个时间字段,每个字段代表的时间都不同.如下表所示: 字段说明: st_mtim(the modification time)记录了文件内容最后一次被修改的时间. st_ctim(the changed-status time)记录了文件的i-node最后一次被修改的时间,如修改文件权限位,修改文件所有者ID,修改关联到该文件的link数目. i-node中的信息和文件的实际内容是分离的,所以当更新i-node时,需要更新的时st_ctim(the ch

UNIX高级环境编程(4)Files And Directories - umask、chmod、文件系统组织结构和链接

本篇主要介绍文件和文件系统中常用的一些函数,文件系统的组织结构和硬链接.符号链接. 通过对这些知识的了解,可以对Linux文件系统有更为全面的了解. ? 1 umask函数 之前我们已经了解了每个文件与权限相关的9个位(bit),我们现在来了解一下当每个进程创建文件时默认会设置该文件的文件权限(the file mode creation mask). umask函数设置该进程默认创建文件的权限掩码(the file mode creation mask),并且返回之前的权限掩码值. #incl

UNIX高级环境编程(17)文件系统 &lt; 雨后 &gt;

来点绿色放松一下眼睛吧 :) 文件系统是对文件和目录的组织集合. 一 设备文件 设备文件和系统的某个设备相对应. 设备驱动程序 处理设备的所有IO请求. 提供了一致的API接口,对应于系统调用的open, close, read, write, mmap以及ioctl,屏蔽了底层设备的差异. 设备的类型 字符型设备:基于每个字符来处理请求,例如终端和鼠标.键盘. 块设备:按数据块处理请求,通常数据块是512字节的整数倍.例如硬盘和磁带. 设备ID 每个设备文件都有主.辅设备文件ID.主文件ID标

UNIX高级环境编程--1

前期准备: 下载apue3源文件(从apuebook.com上),然后编译(make)之后,得到libapue.a动态链接文件(.o 就相当于windows里的obj文件 .a 是好多个.o合在一起,用于静态连接 .so 是shared object,用于动态连接的,和dll差不多). 把apue.h放到 usr/include中,libapue.a放到usr/local/lib中. 如果想要在IDE中编译书中的source_code.c那么要记得设置项目或者文件的 "build option&

《UNIX环境高级编程》读书笔记之文件与目录(2)

动手练习: (1)自己实现ls命令 #include <dirent.h> #include <string.h> int ls(int argc,char * argv[]) { int i; for(i = 2;i < argc;i++) { DIR * dp; struct dirent *dirp; if((dp = opendir(argv[i])) == NULL) err_sys("can't open %s\n",argv[i]); els

UNIX高级环境编程(2)FIle I/O - 原子操作、共享文件描述符和I/O控制函数

引言: 本篇通过对open函数的讨论,引入原子操作,多进程通信(共享文件描述符)和内核相关的数据结构. 还会讨论集中常见的文件IO控制函数,包括: dup和dup2 sync,fsync和fdatasync fcntl ioctl /dev/fd ? 一.文件共享 这里所说的文件共享主要指的是进程间共享打开的文件. 这一节主要讨论文件在进程间共享的理论基础和数据结构,不涉及具体的技术实现,不同的系统可能会有不同的实现. 每一个打开的文件,涉及内核中的三种数据结构,这三种数据结构也是文件在进程间共