关于chomd函数
man 名称:获得函数原型
因为有些函数既是Linux命令,也是系统调用 eg:chomd
- man 2 名称 :获得该函数原型
- man 名称 :获得命令的帮助信息
- 对于库函数 eg: opendir
- man 3 名称:可以获得帮助信息
出错的地方:排序,把东西放到里面;
没有关闭dir;用一次关一次,定义一次;
打不开一个目录的原因:1.没有切换路径,在这个路径下只能打开此路径下的目录与文件,如:在/home/lala下有个目录 .cahe 然后里面有个目录,然后如果你要打开这个目录下的东西你就要切换路径
目录必须有读权限
作用:
- 对文件权限的修改
函数原型
- “`c
include
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
int main(int argc,char **argv)
{
int mode;//权限
int mode_u;//所有者的权限
int mode_g;//所属组的权限
int mode_o;//其他用户的权限
char *path;
/*检查参数个数的合法性*/
if(argc<3)
{
printf("%s <mode num> <target file>\n",argv[0]);
exit(0);
}
/*获取命令行做参数*/
mode=atoi(argv[1]);
if(mode>777||mode<0)
{
printf("mode num error!\n");
exit(0);
}
mode_u=mode/100;
mode_g=(mode -(mode_u*100))/10;
mode_o=mode-(mode_u*100)-mode_g*10;
mode=(mode_u*8*8)+(mode_g*8)+mode_o;
path=argv[2];
if(chmod(path,mode)==-1)
{
perror("chmod error");
exit(1);
}
return 0;
}
有几个注意的地方:
- LINE=5:
int main(int argc,char **argv)
argc: argv的个数
argv: 命令行参数,这个参数是通过命令提示符窗(终端)口运行程序,以空格区分参数格式带入的
这时就有一个问题:为什么是** argv,而不是 *argv?
1.“hello world”这个字符常量的返回值是什么?
一个字符串常量的返回值是char * ,反之也可以用char *存取字符串,那么**argv也很好理解了,ta就是一个指向字符串的指针
2.eg: 当你在终端打入 ./a.out ls -a 时,argv[0]就是./a.out argv[1]就是ls argv[2]就是-a
argv[0]相当于一个二维数组,argv 0 0=’.’以此类推
- LINE=19:
mode=atoi(argv[1]);
- 原型:
int atoi(const char *ptr);
功能:将字符串转换成整形数字。
atoi会扫面参数ptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串结束标志(‘\0’)时才结束转换,并将结果返回。
eg:
#include<stdio.h> #include<stdlib.h> int main(void) { char a[]=" 132 2"; int c; c=atoi(a); printf("%d\n",c); }
结果是:
![2018-07-28 14-45-51 的屏幕截图](/home/lala/图片/2018-07-28 14-45-51 的屏幕截图.png)
文件的输入输出函数
对于内核而言,所有打开的文件都是由文件描述符标识的。文件描述符是一个非负整数,在读写一个文件前,需要调用open或creat函数打开文件,成功执行这两个函数都将返回一个文件描述符,在对文件执行读写操作时,将其作为参数传给read或write
文件描述符 | 文件描述符表示的东西 |
---|---|
0 | 标准输入文件(键盘)(stdin) |
1 | 标准输出文件(显示器)(stdout) |
2 | 标准错误(显示器)(stderr) |
* #### open
- 功能:open系统调用用来打开或创建一个文件
原型:
#include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> int open(const char *pathname,int flags); int open(const char *pathname,int flags,mode_t mode);
参数的解析
const char *pathname:要打开或者创建的韩路径的文件名
flags:打开文件的方式
前三种打开的方式是互斥的,但前三种可以和后面几种进行或运算
打开方式 说明 O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 可读可写打开 O_CREAT 文件不存在自动创建,只有在此时,用到了第三个参数mode来说明新文件的权限 O_EXCL 如果O_CREAT也被设置,则先看文件是否存在,不能存在则创建,存在会导致打开文件出错 O_TRUNC 文件存在并且以可写的方式打开时,此标志会将文件长度清0(数据丢失),但文件属性不变 O_APPEND 写入的数据会以追加的方式加到文件后面 O_SYNC 以同步的方式打开文件,任何对文件的修改会阻塞直到物理磁盘上的数据同步后才返回 O_NOFOLLOW 如果参数pathname所指的文件是一个符号链接则会使打开文件失败 O_DIRECTORY 所指的文件不是一个目录,则会使打开的文件失败 O_NONBLOCK/O_NDELAY 以非阻塞的方式打开文件对于open及随后的对该文件的操作,都会立即返回 - 注:新文件的实际权限是mode和umask按照(mode&~umask)运算以后的结果 eg:umask:045,mode:0740,则新建立的权限实际是0700(先~ 再&)
- mode与chmod中的mode一样
成功调用:返回一个文件描述符
错误:返回-1
- #### creat
功能:创建一个文件
原型:
#include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> int creat(const char *pathname,mode_t mode);
对参数的解析:
- pathname:要打开和创建的文件名
- 如果所指文件不存在,则创建一个
- 如果存在,则旧的会被新的覆盖
- mode也相同
- pathname:要打开和创建的文件名
成功:返回一个文件描述符
失败:返回-1
注意:creat只能以只写的方式打开创建的文件,无法创建设备文件,设备文件的创建要使用mknod函数
- #### close
作用:close系统调用用来关闭一个已经打开的文件
原型:
#include<unistd.h> int close(int fd);
调用成功:返回0
失败:返回-1
close调用成功时不能保证数据能全部写回键盘,其实用户可以不必调用此函数,因为进程结束时内核会自动关闭
- 关于open,creat,close的综合运用
#include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<errno.h> int main(void) { int fd; if((fd=open("a.c",O_CREAT|O_EXCL,S_IRUSR|S_IWUSR))==-1) //if((fd=creat("a.c",S_IRWXU))==-1) { //printf("open:%s with error:%d\n",strerror(errno),errno); perro("open"); exit(1); } close(fd); return 0; }
- #### read
作用:read系统调用用来从打开的文件中读取数据
原型:
#include<unistd.h> ssize_t read(int fd,void *buf,size_t count);
参数:
从文件描述符fd所指的文件中读取count个字节的数据到buf所指的缓存中去
返回值表示实际读取的字节数
如果count=0:read不会读取数据,只返回0。
返回值表示0:如果已经到文件尾或是无可读取的数据。
如果返回字节数与要求读的字节数一样:则没问题。
如果小:可能读到了文件尾部或者read被信号中断了读取过程
错误:返回-1 正确:返回读取的字节数