Linux C Function()参考のファイル権限制御編

19632 ワード


access(             )
    
stat,open,chmod,chown,setuid,setgid
    
#include<unistd.h>
    
int access(const char * pathname,int mode);
    
access()        /         。  mode       ,R_OK,W_OK,X_OK  F_OK。R_OK,W_OK X_OK            、        。F_OK             。  access()       ,             ,  ,        “   ”,                 ,                。  ,    DOS      “   ”  ,  execve()       。
   
                  0 ,    ,            -1。
    
EACCESS   pathname                  。
EROFS                     。
EFAULT   pathname           。
EINVAL   mode    。
ENAMETOOLONG   pathname  。
ENOTDIR   pathname    。
ENOMEM       
ELOOP   pathname         。
EIO I/O     。
    
  access()               ,   access()   open()                 。
  
/*         /etc/passwd */
#include<unistd.h>
int main()
{
if (access(“/etc/passwd”,R_OK) = =0)
printf(“/etc/passwd can be read
”); } /etc/passwd can be read   alphasort( ) scandir,qsort #include<dirent.h> int alphasort(const struct dirent **a,const struct dirent **b); alphasort() scandir() qsort() qsort() , scandir() qsort()。 qsort()。 /* / , */ main() { struct dirent **namelist; int i,total; total = scandir(“/”,&namelist ,0,alphasort); if(total <0) perror(“scandir”); else{ for(i=0;i<total;i++) printf(“%s
”,namelist[i]->d_name); printf(“total = %d
”,total); } } .. .gnome .gnome_private ErrorLog Weblog bin boot dev dosc dosd etc home lib lost+found misc mnt opt proc root sbin tmp usr var total = 24   chdir( ( ) getcwd,chroot #include<unistd.h> int chdir(const char * path); chdir() path 。 0, -1,errno 。 #include<unistd.h> main() { chdir(“/tmp”); printf(“current working directory: %s
”,getcwd(NULL,NULL)); } current working directory :/tmp   chmod( ) fchmod,stat,open,chown #include<sys/types.h> #include<sys/stat.h> int chmod(const char * path,mode_t mode); chmod() mode path 。 mode 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 0, 。 , , S_ISUID S_ISGID , 。 S_ISUID , root 。 0, -1, errno。 EPERM , root 。 EACCESS path 。 EROFS 。 EFAULT path 。 EINVAL mode ENAMETOOLONG path ENOENT ENOTDIR path ENOMEM ELOOP path 。 EIO I/O /* /etc/passwd S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH */ #include<sys/types.h> #include<sys/stat.h> main() { chmod(“/etc/passwd”,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); }   chown( ) fchown,lchown,chmod #include<sys/types.h> #include<unistd.h> int chown(const char * path, uid_t owner,gid_t group); chown() path owner , group 。 owner group -1, 。root , group 。 root chown() , S_ISUID S_ISGID , , S_ISGID S_IXGRP , , 。 0, -1, errno。 chmod()。 /* /etc/passwd root */ #include<sys/types.h> #include<unistd.h> main() { chown(“/etc/passwd”,0,0); }   chroot( ) chdir #include<unistd.h> int chroot(const char * path); chroot() path 。 , 。 0, -1, errno。 EPERM , 。 EFAULT path 。 ENAMETOOLONG path 。 ENOTDIR 。 EACCESS ENOMEM 。 ELOOP path 。 EIO I/O 。 /* /tmp , /tmp */ #include<unistd.h> main() { chroot(“/tmp”); chdir(“/”); }   closedir( ) opendir #include<sys/types.h> #include<dirent.h> int closedir(DIR *dir); closedir() dir 。 0, -1, errno 。 EBADF dir readir()。   fchdir( ) getcwd,chroot #include<unistd.h> int fchdir(int fd); fchdir() fd 。 0, -1,errno 。 #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> main() { int fd; fd = open(“/tmp”,O_RDONLY); fchdir(fd); printf(“current working directory : %s
”,getcwd(NULL,NULL)); close(fd); } current working directory : /tmp   fchmod( ) chmod,stat,open,chown #include<sys/types.h> #include<sys/stat.h> int fchmod(int fildes,mode_t mode); fchmod() mode fildes 。 fildes 。 mode chmod()。 0, -1, errno。 EBADF fildes 。 EPERM , root 。 EROFS 。 EIO I/O 。 #include<sys/stat.h> #include<fcntl.h> main() { int fd; fd = open (“/etc/passwd”,O_RDONLY); fchmod(fd,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); close(fd); }   fchown( ) chown,lchown,chmod #include<sys/types.h> #include<unistd.h> int fchown(int fd,uid_t owner,gid_t group); fchown() fd owner , group 。 owner group -1, 。 fd 。 root fchown() , S_ISUID S_ISGID , 。 0, -1, errno。 EBADF fd 。 EPERM , root , owner、group 。 EROFS 。 ENOENT EIO I/O #include<sys/types.h> #include<unistd.h> #include<fcntl.h> main() { int fd; fd = open (“/etc/passwd”,O_RDONLY); chown(fd,0,0); close(fd); }   fstat( ) stat,lstat,chmod,chown,readlink,utime #include<sys/stat.h> #include<unistd.h> int fstat(int fildes,struct stat *buf); fstat() fildes , buf (struct stat)。Fstat() stat() , 。 stat()。 0, -1, errno。 #include<sys/stat.h> #include<unistd.h> #include<fcntk.h> main() { struct stat buf; int fd; fd = open (“/etc/passwd”,O_RDONLY); fstat(fd,&buf); printf(“/etc/passwd file size +%d
“,buf.st_size); } /etc/passwd file size = 705   ftruncate( ) open,truncate #include<unistd.h> int ftruncate(int fd,off_t length); ftruncate() fd length 。 fd , 。 length , 。 0, -1, errno。 EBADF fd 。 EINVAL fd socket , 。   getcwd( ) get_current_dir_name,getwd,chdir #include<unistd.h> char * getcwd(char * buf,size_t size); getcwd() buf , size buf 。 ,buf , size , NULL,errno ERANGE。 buf NULL,getcwd() size ( malloc()), size 0, getcwd() , free() 。 buf , 。 NULL, errno。 #include<unistd.h> main() { char buf[80]; getcwd(buf,sizeof(buf)); printf(“current working directory : %s
”,buf); } current working directory :/tmp   link( ) symlink,unlink #include<unistd.h> int link (const char * oldpath,const char * newpath); link() newpath ( ) oldpath 。 newpath 。 0, -1, errno。 link() , symlink()。 EXDEV oldpath newpath 。 EPERM oldpath newpath EROFS EFAULT oldpath newpath 。 ENAMETOLLONG oldpath newpath ENOMEM EEXIST newpath 。 EMLINK oldpath 。 ELOOP pathname ENOSPC 。 EIO I/O 。 /* /etc/passwd pass */ #include<unistd.h> main() { link(“/etc/passwd”,”pass”); }   lstat( ) stat,fstat,chmod,chown,readlink,utime #include<sys/stat.h> #include<unistd.h> int lstat (const char * file_name.struct stat * buf); lstat() stat() , file_name , , ,lstat() link 。 stat()。 0, -1, errno。 stat()。   opendir( ) open,readdir,closedir,rewinddir,seekdir,telldir,scandir #include<sys/types.h> #include<dirent.h> DIR * opendir(const char * name); opendir() name , DIR* , open() , 。 DIR* , NULL。 EACCESS EMFILE 。 ENFILE 。 ENOTDIR name ENOENT name , name 。 ENOMEM 。   readdir( ) open,opendir,closedir,rewinddir,seekdir,telldir,scandir #include<sys/types.h> #include<dirent.h> struct dirent * readdir(DIR * dir); readdir() dir 。 dirent struct dirent { ino_t d_ino; ff_t d_off; signed short int d_reclen; unsigned char d_type; har d_name[256; }; d_ino inode d_off d_reclen _name , NULL d_type d_name d_name 。 NULL。 EBADF dir 。 #include<sys/types.h> #include<dirent.h> #include<unistd.h> main() { DIR * dir; struct dirent * ptr; int i; dir =opendir(“/etc/rc.d”); while((ptr = readdir(dir))!=NULL) { printf(“d_name: %s
”,ptr->d_name); } closedir(dir); } d_name:. d_name:.. d_name:init.d d_name:rc0.d d_name:rc1.d d_name:rc2.d d_name:rc3.d d_name:rc4.d d_name:rc5.d d_name:rc6.d d_name:rc d_name:rc.local d_name:rc.sysinit   readlink( ) stat,lstat,symlink #include<unistd.h> int readlink(const char * path ,char * buf,size_t bufsiz); readlink() path buf , NULL , 。 bufsiz , 。 , -1, errno。 EACCESS , EINVAL bufsiz EIO I/O 。 ELOOP 。 ENAMETOOLONG path ENOENT path ENOMEM ENOTDIR path 。   remove( ) link,rename,unlink #include<stdio.h> int remove(const char * pathname); remove() pathname 。 pathname , unlink() , pathname , rmdir() 。 unlink() rmdir()。 0, -1, errno。 EROFS EFAULT pathname ENAMETOOLONG pathname ENOMEM ELOOP pathname EIO I/O 。   rename( ) link,unlink,symlink #include<stdio.h> int rename(const char * oldpath,const char * newpath); rename() oldpath newpath 。 newpath , 。 0, -1, errno /* DOS rename rename */ #include <stdio.h> void main(int argc,char **argv) { if(argc<3){ printf(“Usage: %s old_name new_name
”,argv[0]); return; } printf(“%s=>%s”,argc[1],argv[2]); if(rename(argv[1],argv[2]<0) printf(“error!
”); else printf(“ok!
”); }   rewinddir( ) open,opendir,closedir,telldir,seekdir,readdir,scandir #include<sys/types.h> #include<dirent.h> void rewinddir(DIR *dir); rewinddir() dir 。 EBADF dir #include<sys/types.h> #include<dirent.h> #include<unistd.h> main() { DIR * dir; struct dirent *ptr; dir = opendir(“/etc/rc.d”); while((ptr = readdir(dir))!=NULL) { printf(“d_name :%s
”,ptr->d_name); } rewinddir(dir); printf(“readdir again!
”); while((ptr = readdir(dir))!=NULL) { printf(“d_name: %s
”,ptr->d_name); } closedir(dir); } d_name:. d_name:.. d_name:init.d d_name:rc0.d d_name:rc1.d d_name:rc2.d d_name:rc3.d d_name:rc4.d d_name:rc5.d d_name:rc6.d d_name:rc d_name:rc.local d_name:rc.sysinit readdir again! d_name:. d_name:.. d_name:init.d d_name:rc0.d d_name:rc1.d d_name:rc2.d d_name:rc3.d d_name:rc4.d d_name:rc5.d d_name:rc6.d d_name:rc d_name:rc.local d_name:rc.sysinit   seekdir( ) open,opendir,closedir,rewinddir,telldir,readdir,scandir #include<dirent.h> void seekdir(DIR * dir,off_t offset); seekdir() dir , readdir() 。 offset 。 EBADF dir #include<sys/types.h> #include<dirent.h> #include<unistd.h> main() { DIR * dir; struct dirent * ptr; int offset,offset_5,i=0; dir=opendir(“/etc/rc.d”); while((ptr = readdir(dir))!=NULL) { offset = telldir(dir); if(++i = =5) offset_5 =offset; printf(“d_name :%s offset :%d
”,ptr->d_name,offset); } seekdir(dir offset_5); printf(“Readdir again!
”); while((ptr = readdir(dir))!=NULL) { offset = telldir(dir); printf(“d_name :%s offset :%d
”,ptr->d_name.offset); } closedir(dir); } d_name : . offset :12 d_name : .. offset:24 d_name : init.d offset 40 d_name : rc0.d offset :56 d_name :rc1.d offset :72 d_name:rc2.d offset :88 d_name:rc3.d offset 104 d_name:rc4.d offset:120 d_name:rc5.d offset:136 d_name:rc6.d offset:152 d_name:rc offset 164 d_name:rc.local offset :180 d_name:rc.sysinit offset :4096 readdir again! d_name:rc2.d offset :88 d_name:rc3.d offset 104 d_name:rc4.d offset:120 d_name:rc5.d offset:136 d_name:rc6.d offset:152 d_name:rc offset 164 d_name:rc.local offset :180 d_name:rc.sysinit offset :4096   stat( ) fstat,lstat,chmod,chown,readlink,utime #include<sys/stat.h> #include<unistd.h> int stat(const char * file_name,struct stat *buf); stat() file_name , buf 。 struct stat struct stat { dev_t st_dev; /*device*/ ino_t st_ino; /*inode*/ mode_t st_mode; /*protection*/ nlink_t st_nlink; /*number of hard links */ uid_t st_uid; /*user ID of owner*/ gid_t st_gid; /*group ID of owner*/ dev_t st_rdev; /*device type */ off_t st_size; /*total size, in bytes*/ unsigned long st_blksize; /*blocksize for filesystem I/O */ unsigned long st_blocks; /*number of blocks allocated*/ time_t st_atime; /* time of lastaccess*/ time_t st_mtime; /* time of last modification */ time_t st_ctime; /* time of last change */ }; st_dev st_ino i-node st_mode st_nlink , 1。 st_uid st_gid st_rdev , st_size , st_blksize I/O 。 st_blcoks , 512 。 st_atime , mknod、utime、read、write tructate 。 st_mtime , mknod、utime write st_ctime i-node , 、 、 st_mode S_IFMT 0170000 S_IFSOCK 0140000 scoket S_IFLNK 0120000 S_IFREG 0100000 S_IFBLK 0060000 S_IFDIR 0040000 S_IFCHR 0020000 S_IFIFO 0010000 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 POSIX S_ISLNK (st_mode) S_ISREG (st_mode) S_ISDIR (st_mode) S_ISCHR (st_mode) S_ISBLK (s3e) S_ISSOCK (st_mode) socket sticky (S_ISVTX), 、 root 。 0, -1, errno ENOENT file_name ENOTDIR ELOOP , 16 EFAULT buf , EACCESS ENOMEM ENAMETOOLONG file_name #include<sys/stat.h> #include<unistd.h> mian() { struct stat buf; stat (“/etc/passwd”,&buf); printf(“/etc/passwd file size = %d
”,buf.st_size); } /etc/passwd file size = 705   symlink( ) link,unlink #include<unistd.h> int symlink( const char * oldpath,const char * newpath); symlink() newpath ( ) oldpath 。 oldpath , newpath 。 0, -1, errno。 EPERM oldpath newpath EROFS EFAULT oldpath newpath 。 ENAMETOOLONG oldpath newpath ENOMEM EEXIST newpath 。 EMLINK oldpath ELOOP pathname ENOSPC EIO I/O #include<unistd.h> main() { symlink(“/etc/passwd”,”pass”); }   telldir( ) open,opendir,closedir,rewinddir,seekdir,readdir,scandir #include<dirent.h> off_t telldir(DIR *dir); telldir() dir 。 , -1。 EBADF dir 。 #include<sys/types.h> #include<dirent.h> #include<unistd.h> main() { DIR *dir; struct dirent *ptr; int offset; dir = opendir(“/etc/rc.d”); while((ptr = readdir(dir))!=NULL) { offset = telldir (dir); printf(“d_name : %s offset :%d
”, ptr->d_name,offset); } closedir(dir); } d_name : . offset :12 d_name : .. offset:24 d_name : init.d offset 40 d_name : rc0.d offset :56 d_name :rc1.d offset :72 d_name:rc2.d offset :88 d_name:rc3.d offset 104 d_name:rc4.d offset:120 d_name:rc5.d offset:136 d_name:rc6.d offset:152 d_name:rc offset 164 d_name:rc.local offset :180 d_name:rc.sysinit offset :4096   truncate( ) open,ftruncate #include<unistd.h> int truncate(const char * path,off_t length); truncate() path length 。 length , 。 0, -1, errno。 EACCESS path 。 EROFS EFAULT path EINVAL path ENAMETOOLONG path ENOTDIR path EISDIR path ETXTBUSY path , ELOOP path’ EIO I/O 。   umask( ) creat,open #include<sys/types.h> #include<sys/stat.h> mode_t umask(mode_t mask); umask() umask mask&0777 , umask 。 open() , mode , (mode&~umask) 。 , 0666, umask 022, 0666&~022=0644, rw-r--r-- 。 umask 。   unlink( ) link,rename,remove #include<unistd.h> int unlink(const char * pathname); unlink() pathname 。 , , 。 pathname , 。 0, -1, errno EROFS EFAULT pathname ENAMETOOLONG pathname ENOMEM ELOOP pathname EIO I/O   utime( ) utimes,stat #include<sys/types.h> #include<utime.h> int utime(const char * filename,struct utimbuf * buf); utime() filename inode 。 utimbuf struct utimbuf{ time_t actime; time_t modtime; }; buf (NULL), 。 0, -1, errno。 EACCESS , ENOENT 。   utimes( ) utime,stat #include<sys/types.h> #include<utime.h> int utimes(char * filename.struct timeval *tvp); utimes() filename inode 。 timeval struct timeval { long tv_sec; long tv_usec; /* */ }; tvp timeval , utime() utimebuf ,tvp[0].tc_sec utimbuf.actime,tvp]1].tv_sec utimbuf.modtime。 0。 -1, errno。 EACCESS , ENOENT