#include"unp.h"
int main()
{
int f;
const char *fpath="test2";
mode_t fattrib;
struct stat *buf=malloc(sizeof(stat)); //动态分配结构体*buf的内存
fattrib=S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
f=creat(fpath,fattrib); //创建一个文件并设置权限
if(f==-1)
{
puts("文件创建失败!");
return 1;
}
else
puts("文件创建成功!");
fstat(f,buf); //通过文件标识符获取访问权限
if(buf->st_mode & S_IRUSR)
puts("让所有者拥有读权限!");
/* if(!(buf->st_mode & S_IXUSR))
puts("所有者没有执行权限!"); */
if(buf->st_mode & S_IRGRP)
puts("群组拥有读权限!");
close(f);
chmod(fpath,0771); //修改该文件的权限
stat(fpath,buf); //通过路径获取访问权限
if(buf->st_mode & S_IWUSR)
puts("让所有者拥有写权限!");
if(buf->st_mode & S_IWGRP)
puts("群组拥有写权限!");
if(buf->st_mode & S_IXUSR)
puts("所有者有执行权限!");
free(buf);
return 0;
}
用gcc编译后没错误,运行后出现如下错误:
[tsj@tangshaojie xx 18:52]$ gcc -o 2 2.c
[tsj@tangshaojie xx 18:54]$ ./2
文件创建成功!
让所有者拥有读权限!
群组拥有读权限!
让所有者拥有写权限!
群组拥有写权限!
所有者有执行权限!
*** glibc detected *** ./2: free(): invalid next size (fast): 0x09f5e008 ***
======= Backtrace: =========
/lib/libc.so.6(+0x70e31)[0x1bce31]
/lib/libc.so.6(+0x73571)[0x1bf571]
./2[0x8048658]
/lib/libc.so.6(__libc_start_main+0xe6)[0x162d26]
./2[0x8048481]
======= Memory map: ========
0014c000-002dd000 r-xp 00000000 08:02 785932 /lib/libc-2.12.so
002dd000-002df000 r--p 00191000 08:02 785932 /lib/libc-2.12.so
002df000-002e0000 rw-p 00193000 08:02 785932 /lib/libc-2.12.so
002e0000-002e3000 rw-p 00000000 00:00 0
005bb000-005d8000 r-xp 00000000 08:02 785909 /lib/libgcc_s-4.4.7-20120601.so.1
005d8000-005d9000 rw-p 0001d000 08:02 785909 /lib/libgcc_s-4.4.7-20120601.so.1
008eb000-00909000 r-xp 00000000 08:02 785925 /lib/ld-2.12.so
00909000-0090a000 r--p 0001d000 08:02 785925 /lib/ld-2.12.so
0090a000-0090b000 rw-p 0001e000 08:02 785925 /lib/ld-2.12.so
00cfb000-00cfc000 r-xp 00000000 00:00 0 [vdso]
看上去感觉是free的时候指针已经越界了, 楼主可以GDB调试一下
已查明 应该是 struct stat *buf = (struct stat*)malloc(sizeof(struct stat));