st_mode 9 . : s_Ipwww, p - (R, w X), a www - (USR, GRP OTH).
S_Ixwww x = R|W|X, www = USR|GRP|OTH
:
S_IRUSR,
S_IWOTH
S_ISUID set-user-id bit is set
S_ISGID set-group-id bit is set
S_ISVTX sticky bit is set
ֳ .
.
, .
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <sys/param.h>
#include <sys/fcntl.h>
main
{
struct stat st;
int fd;
open(file,O_RDONLY);
for(fd=0; fd < NOFILE; fd++)
if (fstat(fd, &st ==0)
{ printf("File stats\n");
printf(" File size: %ld\n", st.st_size);
printf(" Permission: %o\n", st.st_mode & 0x01ff);
/* = 0001 1111 1111
stat(, &st);
= st.st_mode & 0777;
S_IRWXU| S_IRWXG| S_IRWXO
*/
printf(" Owner uid: %d\n", st.st_uid);
printf(" Owner gid: %d\n", st.st_gid);
printf("\n");
}
}
}
0..NOFILE-1 ( 0..19). fstat fd (<0), , ' ( ). NOFILE include- <sys/param.h>, .
'. fstat , .
3.
access (filename, mode)
char * filename;
int mode;
access , , pathname , , . mode - , R_OK, W_OK, X_OK F_OK.
R_OK, W_OK X_OK , , , F_OK .
0 , -1 ( - errno)
chown -
int chown (path, owner, group)
char * path;
int owner, group;
path ' . , , owner group.
ҳ root . - , . Root .
|
|
chmod -
# Include <sys/types.h>
# include <sys/stat.h>
int chmod (const char * path, mode_t mode);
int fchmod (int fildes, mode_t mode);
,
0777 | S_ISUID | S_ISGID | S_ISVTX
path ' . chmod , mode.
, , .
chown chmod , , 04000 02000 , .
, . umask, - , umask.
Umask - .
# Include <sys/stat.h>
mode_t umask (mode_t cmask);
cmask -
- 9 , umask . ³ . , umask. - ( - ), - .
4.
, , , , , , fcntl.
#include <fcntl.h>
int fcntl (int fd, int cmd, arg)
cmd fd.
.
3
cmd
F_DUPFD | . , ; |
F_GETFD | , ; |
F_SETFD | , ; |
F_GETFL | , ; |
F_SETFL | , ; |
F_GETLK | ; |
F_SETLK | ; |
F_SETLKW | F_SETLK, ; |
F_GETOWN | , SIGIO |
F_SETOWN | , SIGIO |
ij
cmd :
|
|
F_DUPFD .
F_GETFD ( ).
F_SETFD , -1.
F_GETFL .
F_SETFL , -1.
F_GETLK , -1.
F_SETLK , -1.
F_SETLKW , -1.
-1, errno .
1) , , , ?
int flags;
if((flags=fcntl (fd, F_GETFL, NULL)) < 0)
return NULL; /* fd */
flags &= O_RDONLY | O_WRONLY | O_RDWR;
switch(flags){
case O_RDONLY: return "r";
case O_WRONLY: return "w";
case O_RDWR: return "r+w";
default: return NULL;
}
2) :
int flags = fcntl (fd, F_GETFL, 0);
fcntl (fd, F_SETFL, flags | O_NONBLOCK);
3)
fcntl(fd, F_SETOWN, getpid())
4) setflag (int desc, int value)
{
int oldflags = fcntl (desc, F_GETFL, 0);
/* , */
if (oldflags == -1)
return -1;
/* */
if (value!= 0)
oldflags |= O_NONBLOCK;
else
oldflags &= ~O_NONBLOCK;
/* */
return fcntl (desc, F_SETFL, oldflags);
}
: 0, 0, .
|= ?=~ ~
, .
fcntl
fcntl(2) . , .
, , , . , , . .
cmd - , arg flock, . <fcntl.h>.
4
flock
short l_type | : F_RDLCK, F_WRLCK, F_UNLCK. |
short l_whence | , ; (0), (1), (2) |
4
long l_start | , l_whence |
long l_len | , , . 0, l_start |
long l_pid | , ( GETLCK) |
long l_sysid | , |
, fcntl -1.
F_GETLK , , .
, , .
(advisory) ('). , , , , . fcntl() ' , .
|
|
:
− , , , fcntl F_RDLCK
− , , flock F_WRLCK.
− flock , , .
− ϳ F_UNLCK