关于umask,perror,strerror和如何输出有颜色字

来源:互联网 发布:linux rc.local 日志 编辑:程序博客网 时间:2024/06/05 06:07

umask的作用
umask为默认权限,与chmod不同。chmod指定的是该文件各个用户所拥有的权限,umask指定的是该文件所没有的权限,但是都可以用数字来表示相应的权限,rwx(4,2,1).

[limeng@localhost test]$ umask0002[limeng@localhost test]$ touch 1.txt[limeng@localhost test]$ mkdir a[limeng@localhost test]$ ls -l总用量 4-rw-rw-r-- 1 limeng limeng    0 717 20:14 1.txtdrwxrwxr-x 2 limeng limeng 4096 717 20:15 a[limeng@localhost test]$ umask 0005[limeng@localhost test]$ umask0005[limeng@localhost test]$ touch 2.txt[limeng@localhost test]$ mkdir b[limeng@localhost test]$ ls -l总用量 8-rw-rw-r-- 1 limeng limeng    0 717 20:14 1.txt-rw-rw--w- 1 limeng limeng    0 717 20:15 2.txtdrwxrwxr-x 2 limeng limeng 4096 717 20:15 adrwxrwx-w- 2 limeng limeng 4096 717 20:16 b/*用户limeng的默认权限为0002 该权限是被拿掉的文件默认没有x权限,目录有x权限0002表上示拿掉其他人的w权限,创建的1.txt和a目录都符合将umask改为0005,则拿掉其他人的r和x权限,生成的2.txt和b目录符合*/

用open或者creat新建一个文件时,需要指定权限mode,而实际存储的权限是mode和umask按(mode & ~mask)运算后的结果。(位运算)

当通过 open 或者 creat 调用创建文件时,mode参数将与当前的umask值进行比较。在mode参数中被设置的位如果在umask值中也被设置了,那么它就会从文件的访问权限中删除。

perror和strerror的区别

perror() 和 strerror() 以一种直观的方式打印出错误信息,对于调试程序和编写优秀的程序非常有用。

perror()原型:void perror(const char *s);
其中,perror()的参数s 是用户提供的字符串。当调用perror()时,它先输出这个字符串,后面跟着一个冒号和空格,然后是基于当前errno的值进行的错误类型描述。

strerror()原型:char * strerror(int errnum);
通过标准错误的标号,获得错误的描述字符串,将单纯的错误标号转换成字符串,方便查错
errno 是记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义。只有当一个库函数失败时,errno才会被设置。当函数成功运行时,errno的值不会被修改。这意味着我们不能通过测试errno的值来判断是否有错误存在。反之,只有当被调用的函数提示有错误发生时检查errno的值才有意义。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>   //最后是L的小写,不是1#include<unistd.h>#include<errno.h>int main(void){    int fd;    if((fd=open("example.c",O_CREAT|O_EXCL,S_IRUSR|S_IWUSR))==-1){    //if((fd=creat("example.c",S_IRWXU))==-1){        perror("open");        printf("open:%s with errno:%d\n",strerror(errno),errno);        exit(1);    }    else{        printf("create file successfully!\n");    }    close(fd);    return 0;}[limeng@localhost 7.17]$ gcc my_create.c [limeng@localhost 7.17]$ ./a.out create file successfully![limeng@localhost 7.17]$ ./a.out open: File existsopen:File exists with errno:17

int main(int agrc,char ** argv)
argc 整数,用来统计你运行程序时送给的命令行参数的个数
 * argv: 字符串,用来存放指向你的字符串参数的,每一个元素指向一个参数
 argv[0] 指向程序运行的全路径名
 argv[1] 指向在命令行中执行程序名后的第一个字符串
 argv[2] 指向执行程序名后的第二个字符串
int main(int argc,char **argv) 相当于 int main(int argc,char *argv[ ] )

/*C语言中_FILE_用以指示本行语句所在源文件的文件名_LINE_用以指示本行语句在源文件中的位置信息,还可以通过语句#line来重新设定_LINE_的值gcc还支持_func_,它指示所在的函数,但是这个关键字不被windows下的vc6.0支持*/

关于链表是否有环问题,可以参照我以前的博客:单链表是否有环的问题

感觉linux下的文件操作与c语言的文件操作有挺大的区别,需要熟悉,并多加练习。今天开始写myls,实现了-a,-l,-al功能,但是文件的显示都是默认,不会像linux中的ls同时会以文件的属性显示相应的颜色。
例如:
蓝色表示目录;
绿色表示可执行文件;
红色表示压缩文件;
浅蓝色表示链接文件;
灰色表示其它文件;
红色闪烁表示链接的文件有问题了;
黄色是设备文件,包括block, char, fifo。

通过printf可以控制格式输出:

控制字符的通用格式如下:Esc[{attr1};…;{attrn}m

其中:
Esc 是转义字符, 其值为”\033”;
[ 是常量的左中括号;
{attr1};…{attrn} 是若干属性, 通常是由一个有特定意义的数字代替, 每个属性之间用分号分隔;
m 就是字面常量字符m;

属性列表如下:
一. 通用格式控制:
0 重置所有属性
1 高亮/加粗
2 暗淡
4 下划线
5 闪烁
7 反转
8 隐藏

二. 前景色:
30 黑色
31 红色
32 绿色
33 黄色
34 蓝色
35 品红
36 青色
37 白色

三. 背景色:
40 黑色
41 红色
42 绿色
43 黄色
44 蓝色
45 品红
46 青色
47 白色

如果同时还要加上黄色的背景:

printf("\033[31;43mThis text is red with yellow background \033[0m\n");  

但是对于各个文件的分类不是特别好操作,所以目录及文件颜色以后再考虑。
先将其他的功能先写好。