int chmod(*char,int ):系统调用修改文件访问权限属性函数
- 头文件:#include < sys/types.h > ,include < sys/stat.h >
- 返回值:失败返回-1 成功返回0;
- 传入值:
-
- 第一个为文件名,可以是文件自己的名字(即可以修改文件自己的访问权限)
这里要注意一下修改自己包括源文件和可执行文件注意两个文件的名字不同
- 第一个为文件名,可以是文件自己的名字(即可以修改文件自己的访问权限)
-
- 第二个为权限类型
1.chmod(“gjldw”,0777);//传入一个八进制数(0开头,这样有个问题,没法用一个整形变量来表示一个0开头的数,只能固定一个权限。所以有下面这个方法)
2.chmod(“gjldw”,511);//传入一个十进制数(这个由八进制算来的,0777=511,所以就可以通过一个变量来储存511,可以按照不同的要求进行相应的权限修改)
3chmod(“gjldw”,S_IRUSR|S_ISGID |S_ISVTX |…);//传入字符常量值(这样问题和第一个一样。具体的字符常量和对应八进制如下:)
- 第二个为权限类型
S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-id on execution)位
S_ISVTX 01000 文件的sticky位
S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限
open,close,read,write,lseek等函数
#include< stdio.h>
#include< sys/types.h>//read open ...等
#include< sys/stat.h>
#include< fcntl.h>
#include< unistd.h>//lseek
#include< errno.h>//errno全局变量
int main()
{
int len,set;
char b[100];
char a[]="gjldw"; //int a=100;
int p1=open("sdfd.txt",O_RDWR|O_CREAT|O_EXCL,777);//open打开方式
if(p1==-1)//打开不成功返回-1,成功返回文件描述符
{
perror("sdfd.txt");//这个函数可以自动找出错误提示,此错误原因依照全局变量errno 的值来决定要输出的字符串。在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。
printf("%s ",strerror(errno));//这两句和上面那个效果一样,errno错误的编号
printf("%d ",errno);
fprintf(stderr,"%d ",__LINE__);//__LINE__这个是内置宏,表示在源文件的行数行数(记得是两个下划线)
exit(1);
/*此处退出结果(第二次文件运时文件就存在了O_EXCL打开出错)
sdfd.txt: File exists(文件已存在)
File exists 19 24(输出行数19,输出errno错误的编号:24)
*/
}
write(p1,&a,sizeof(a));//写函数,返回值为写入的字节数
len=lseek(p1,0,SEEK_END);//lseek,返回值为移动后指针距离文件开头的字节数
printf("%d ",len);//(把文件已到尾返回值赋给len就可以知道文件的长度)
printf("%d ",lseek(p1,0,SEEK_SET));//将指针移动到开头
printf("%d ",read(p1,b,len));//返回值为读取的字节数(已经知道前面文件长度了,用这个读一次就好)
/*if(read(p1,b,len)!=len)//如果读的长度和返回值不一样就说名读错了
{
perror("read");
}*/
printf("%s \n",b);//输出一次文件里读的东西
lseek(p1,10,SEEK_END);//这里就有点奇怪了 文件指针移动到结尾的后面十个字节,这时相当与给文件变长了,末尾加了十个‘\0’,
write(p1,&a,sizeof(a));//又写入了了一次(这是在在文件末尾添加了一次,即十个‘\0'之后)
len=lseek(p1,0,SEEK_END);//再次看一下长度,以及下面的对比一下
printf("%d ",len);
printf("%d ",lseek(p1,0,SEEK_SET));
printf("%d ",read(p1,b,len));
printf("%s ",b);
close(p1);
return 0;
}
程序运行第一次结果:
6 0 6 gjldw(注意函数们的返回值)
22 0 22 gjldw(前后对比看出文件指针移动到结尾的后面的方式)
程序结束后我们用od命令打开文件看看里面的东西
gjln@gjldw:~/gjl/练习/练习$ od -c sdfd.txt
0000000 g j l d w \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0(这里我们发现加了十个’\0’)
0000020 g j l d w \0
0000026
此外open 的一些打开方式的参数我就不写了...
最后记一点宏跟踪调试
ANSI标准说明了五个预定义的宏名。它们是:
_ _ LINE_ _
_ _ FILE_ _(友情提示他们都是左右双下划线)
_ _ DATE_ _
_ _ TIME_ _
_ _ STDC_ _
_ _ FILE _ _ 是内置宏 代表源文件的文件名
_ _ LINE _ _ 是内置宏,代表该行代码的所在行号
_ _ DATE_ _宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。
_ _ TIME_ _宏指令含有形式为时:分:秒的串,表示源文件被翻译到代码时的时间。
如果实现是标准的,则宏STDC含有十进制常量1。如果它含有任何其它数,则实现是非标准的。