umask的作用
umask为默认权限,与chmod不同。chmod指定的是该文件各个用户所拥有的权限,umask指定的是该文件所没有的权限,但是都可以用数字来表示相应的权限,rwx(4,2,1).
[limeng@localhost test]$ umask
0002
[limeng@localhost test]$ touch 1.txt
[limeng@localhost test]$ mkdir a
[limeng@localhost test]$ ls -l
总用量 4
-rw-rw-r-- 1 limeng limeng 0 7月 17 20:14 1.txt
drwxrwxr-x 2 limeng limeng 4096 7月 17 20:15 a
[limeng@localhost test]$ umask 0005
[limeng@localhost test]$ umask
0005
[limeng@localhost test]$ touch 2.txt
[limeng@localhost test]$ mkdir b
[limeng@localhost test]$ ls -l
总用量 8
-rw-rw-r-- 1 limeng limeng 0 7月 17 20:14 1.txt
-rw-rw--w- 1 limeng limeng 0 7月 17 20:15 2.txt
drwxrwxr-x 2 limeng limeng 4096 7月 17 20:15 a
drwxrwx-w- 2 limeng limeng 4096 7月 17 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 exists
open: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");
但是对于各个文件的分类不是特别好操作,所以目录及文件颜色以后再考虑。
先将其他的功能先写好。