?? linux 常用c函數(shù)(中文版)-文件權(quán)限控制.htm
字號(hào):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0051)http://net.pku.edu.cn/~yhf/linux_c/function/12.html -->
<HTML><HEAD><TITLE>Untitled Document</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2462.0" name=GENERATOR></HEAD>
<BODY>
<TABLE width="100%">
<TBODY>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋體 size=2><A
name=linuxc211></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋體 size=2><BR>access(判斷是否具有存取文件的權(quán)限) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關(guān)函數(shù) </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>stat,open,chmod,chown,setuid,setgid<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>#include<unistd.h><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>定義函數(shù) </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>int access(const char * pathname,int
mode);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>函數(shù)說明 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>access()會(huì)檢查是否可以讀/寫某一已存在的文件。參數(shù)mode有幾種情況組合,R_OK,W_OK,X_OK
和F_OK。R_OK,W_OK與X_OK用來檢查文件是否具有讀取、寫入和執(zhí)行的權(quán)限。F_OK則是用來判斷該文件是否存在。由于access()只作權(quán)限的核查,并不理會(huì)文件形態(tài)或文件內(nèi)容,因此,如果一目錄表示為“可寫入”,表示可以在該目錄中建立新文件等操作,而非意味此目錄可以被當(dāng)做文件處理。例如,你會(huì)發(fā)現(xiàn)DOS的文件都具有“可執(zhí)行”權(quán)限,但用execve()執(zhí)行時(shí)則會(huì)失敗。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>若所有欲查核的權(quán)限都通過了檢查則返回0值,表示成功,只要有一權(quán)限被禁止則返回-1。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>錯(cuò)誤代碼 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>EACCESS 參數(shù)pathname 所指定的文件不符合所要求測(cè)試的權(quán)限。<BR>EROFS
欲測(cè)試寫入權(quán)限的文件存在于只讀文件系統(tǒng)內(nèi)。<BR>EFAULT 參數(shù)pathname指針超出可存取內(nèi)存空間。<BR>EINVAL 參數(shù)mode
不正確。<BR>ENAMETOOLONG 參數(shù)pathname太長(zhǎng)。<BR>ENOTDIR 參數(shù)pathname為一目錄。<BR>ENOMEM
核心內(nèi)存不足<BR>ELOOP 參數(shù)pathname有過多符號(hào)連接問題。<BR>EIO I/O 存取錯(cuò)誤。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>附加說明 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>使用access()作用戶認(rèn)證方面的判斷要特別小心,例如在access()后再做open()的空文件可能會(huì)造成系統(tǒng)安全上的問題。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>/* 判斷是否允許讀取/etc/passwd
*/<BR>#include<unistd.h><BR>int main()<BR>{<BR>if
(access(“/etc/passwd”,R_OK) = =0)<BR>printf(“/etc/passwd can be
read\n”);<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>執(zhí)行 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>/etc/passwd can be read<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋體 size=2><A
name=linuxc212></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋體 size=2><BR>alphasort(依字母順序排序目錄結(jié)構(gòu)) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關(guān)函數(shù) </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>scandir,qsort<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>#include<dirent.h><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>定義函數(shù) </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>int alphasort(const struct dirent **a,const
struct dirent **b);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>函數(shù)說明 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>alphasort()為scandir()最后調(diào)用qsort()函數(shù)時(shí)傳給qsort()作為判斷的函數(shù),詳細(xì)說明請(qǐng)參考scandir()及qsort()。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>參考qsort()。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>/*
讀取/目錄下所有的目錄結(jié)構(gòu),并依字母順序排列*/<BR>main()<BR>{<BR>struct dirent
**namelist;<BR>int i,total;<BR>total = scandir(“/”,&namelist
,0,alphasort);<BR>if(total
<0)<BR>perror(“scandir”);<BR>else{<BR>for(i=0;i<total;i++)<BR>printf(“%s\n”,namelist[i]->d_name);<BR>printf(“total
= %d\n”,total);<BR>}<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>執(zhí)行 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>..<BR>.gnome<BR>.gnome_private<BR>ErrorLog<BR>Weblog<BR>bin<BR>boot<BR>dev<BR>dosc<BR>dosd<BR>etc<BR>home<BR>lib<BR>lost+found<BR>misc<BR>mnt<BR>opt<BR>proc<BR>root<BR>sbin<BR>tmp<BR>usr<BR>var<BR>total
= 24<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋體 size=2><A
name=linuxc213></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋體 size=2><BR>chdir(改變當(dāng)前的工作(目錄) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關(guān)函數(shù) </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>getcwd,chroot<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>#include<unistd.h><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>定義函數(shù) </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>int chdir(const char * path);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>函數(shù)說明 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>chdir()用來將當(dāng)前的工作目錄改變成以參數(shù)path所指的目錄。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>執(zhí)行成功則返回0,失敗返回-1,errno為錯(cuò)誤代碼。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>#include<unistd.h><BR>main()<BR>{<BR>chdir(“/tmp”);<BR>printf(“current
working directory: %s\n”,getcwd(NULL,NULL));<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>執(zhí)行 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>current working directory :/tmp<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋體 size=2><A
name=linuxc214></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋體 size=2><BR>chmod(改變文件的權(quán)限) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關(guān)函數(shù) </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>fchmod,stat,open,chown<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>#include<sys/types.h><BR>#include<sys/stat.h><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>定義函數(shù) </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>int chmod(const char * path,mode_t
mode);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>函數(shù)說明 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>chmod()會(huì)依參數(shù)mode 權(quán)限來更改參數(shù)path
指定文件的權(quán)限。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>參數(shù) </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>mode 有下列數(shù)種組合<BR>S_ISUID 04000 文件的(set user-id on
execution)位<BR>S_ISGID 02000 文件的(set group-id on execution)位<BR>S_ISVTX
01000 文件的sticky位<BR>S_IRUSR(S_IREAD) 00400
文件所有者具可讀取權(quán)限<BR>S_IWUSR(S_IWRITE)00200 文件所有者具可寫入權(quán)限<BR>S_IXUSR(S_IEXEC)
00100 文件所有者具可執(zhí)行權(quán)限<BR>S_IRGRP 00040 用戶組具可讀取權(quán)限<BR>S_IWGRP 00020
用戶組具可寫入權(quán)限<BR>S_IXGRP 00010 用戶組具可執(zhí)行權(quán)限<BR>S_IROTH 00004
其他用戶具可讀取權(quán)限<BR>S_IWOTH 00002 其他用戶具可寫入權(quán)限<BR>S_IXOTH 00001
其他用戶具可執(zhí)行權(quán)限<BR>只有該文件的所有者或有效用戶識(shí)別碼為0,才可以修改該文件權(quán)限。基于系統(tǒng)安全,如果欲將數(shù)據(jù)寫入一執(zhí)行文件,而該執(zhí)行文件具有S_ISUID
或S_ISGID 權(quán)限,則這兩個(gè)位會(huì)被清除。如果一目錄具有S_ISUID
位權(quán)限,表示在此目錄下只有該文件的所有者或root可以刪除該文件。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>權(quán)限改變成功返回0,失敗返回-1,錯(cuò)誤原因存于errno。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>錯(cuò)誤代碼 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>EPERM
進(jìn)程的有效用戶識(shí)別碼與欲修改權(quán)限的文件擁有者不同,而且也不具root權(quán)限。<BR>EACCESS
參數(shù)path所指定的文件無法存取。<BR>EROFS 欲寫入權(quán)限的文件存在于只讀文件系統(tǒng)內(nèi)。<BR>EFAULT
參數(shù)path指針超出可存取內(nèi)存空間。<BR>EINVAL 參數(shù)mode不正確<BR>ENAMETOOLONG 參數(shù)path太長(zhǎng)<BR>ENOENT
指定的文件不存在<BR>ENOTDIR 參數(shù)path路徑并非一目錄<BR>ENOMEM 核心內(nèi)存不足<BR>ELOOP
參數(shù)path有過多符號(hào)連接問題。<BR>EIO I/O 存取錯(cuò)誤<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>/* 將/etc/passwd
文件權(quán)限設(shè)成S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH
*/<BR>#include<sys/types.h><BR>#include<sys/stat.h><BR>main()<BR>{<BR>chmod(“/etc/passwd”,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋體 size=2><A
name=linuxc215></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋體 size=2><BR>chown(改變文件的所有者) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關(guān)函數(shù) </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>fchown,lchown,chmod<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>#include<sys/types.h><BR>#include<unistd.h><BR></FONT></TD></TR>
<TR>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -