?? 12.htm
字號:
<!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.2800.1479" 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(判斷是否具有存取文件的權限) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關函數 </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>定義函數 </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>函數說明 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>access()會檢查是否可以讀/寫某一已存在的文件。參數mode有幾種情況組合,R_OK,W_OK,X_OK
和F_OK。R_OK,W_OK與X_OK用來檢查文件是否具有讀取、寫入和執行的權限。F_OK則是用來判斷該文件是否存在。由于access()只作權限的核查,并不理會文件形態或文件內容,因此,如果一目錄表示為“可寫入”,表示可以在該目錄中建立新文件等操作,而非意味此目錄可以被當做文件處理。例如,你會發現DOS的文件都具有“可執行”權限,但用execve()執行時則會失敗。<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>若所有欲查核的權限都通過了檢查則返回0值,表示成功,只要有一權限被禁止則返回-1。<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>EACCESS 參數pathname 所指定的文件不符合所要求測試的權限。<BR>EROFS
欲測試寫入權限的文件存在于只讀文件系統內。<BR>EFAULT 參數pathname指針超出可存取內存空間。<BR>EINVAL 參數mode
不正確。<BR>ENAMETOOLONG 參數pathname太長。<BR>ENOTDIR 參數pathname為一目錄。<BR>ENOMEM
核心內存不足<BR>ELOOP 參數pathname有過多符號連接問題。<BR>EIO I/O 存取錯誤。<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()作用戶認證方面的判斷要特別小心,例如在access()后再做open()的空文件可能會造成系統安全上的問題。<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>執行 </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(依字母順序排序目錄結構) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關函數 </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>定義函數 </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>函數說明 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>alphasort()為scandir()最后調用qsort()函數時傳給qsort()作為判斷的函數,詳細說明請參考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>/*
讀取/目錄下所有的目錄結構,并依字母順序排列*/<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>執行 </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(改變當前的工作(目錄) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關函數 </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>定義函數 </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>函數說明 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>chdir()用來將當前的工作目錄改變成以參數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>執行成功則返回0,失敗返回-1,errno為錯誤代碼。<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>執行 </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(改變文件的權限) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關函數 </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>定義函數 </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>函數說明 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>chmod()會依參數mode 權限來更改參數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>mode 有下列數種組合<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
文件所有者具可讀取權限<BR>S_IWUSR(S_IWRITE)00200 文件所有者具可寫入權限<BR>S_IXUSR(S_IEXEC)
00100 文件所有者具可執行權限<BR>S_IRGRP 00040 用戶組具可讀取權限<BR>S_IWGRP 00020
用戶組具可寫入權限<BR>S_IXGRP 00010 用戶組具可執行權限<BR>S_IROTH 00004
其他用戶具可讀取權限<BR>S_IWOTH 00002 其他用戶具可寫入權限<BR>S_IXOTH 00001
其他用戶具可執行權限<BR>只有該文件的所有者或有效用戶識別碼為0,才可以修改該文件權限。基于系統安全,如果欲將數據寫入一執行文件,而該執行文件具有S_ISUID
或S_ISGID 權限,則這兩個位會被清除。如果一目錄具有S_ISUID
位權限,表示在此目錄下只有該文件的所有者或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>權限改變成功返回0,失敗返回-1,錯誤原因存于errno。<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>EPERM
進程的有效用戶識別碼與欲修改權限的文件擁有者不同,而且也不具root權限。<BR>EACCESS
參數path所指定的文件無法存取。<BR>EROFS 欲寫入權限的文件存在于只讀文件系統內。<BR>EFAULT
參數path指針超出可存取內存空間。<BR>EINVAL 參數mode不正確<BR>ENAMETOOLONG 參數path太長<BR>ENOENT
指定的文件不存在<BR>ENOTDIR 參數path路徑并非一目錄<BR>ENOMEM 核心內存不足<BR>ELOOP
參數path有過多符號連接問題。<BR>EIO I/O 存取錯誤<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
文件權限設成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>相關函數 </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>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -