標籤:include linux touch error 影響
判斷/home下有沒有檔案aaa.txt,如果存在則提示錯誤,如果檔案不存在則建立且檔案最終許可權為644。
#include<stdio.h>#include<fcntl.h>int main(void){int fd;fd = open("/home/aaa.txt",O_WRONLY | O_CREAT | O_EXCL,0666);if (fd == -1)printf ("Error: File exists.\n" );}
650) this.width=650;" title="未命名.jpg" src="http://s3.51cto.com/wyfs02/M02/41/72/wKioL1PV7zuAGuCJAACOo532xvg444.jpg" alt="wKioL1PV7zuAGuCJAACOo532xvg444.jpg" />
例子的代碼比較簡單,但是有幾個地方需要說明,一個檔案的許可權是受到open函數參數給定(代碼是0666)和umask值同時影響的,0666-0022=0644(更準確的方法是使用“與運算”獲得許可權)
650) this.width=650;" title="未命名.jpg" src="http://s3.51cto.com/wyfs02/M02/41/72/wKiom1PV7rbgSKYfAAAX_n3M3Fw732.jpg" alt="wKiom1PV7rbgSKYfAAAX_n3M3Fw732.jpg" />
當前為root使用者umask是0022,在當前shell下啟的進程都是會繼承當前的umask值,包括make,gcc和touch命令的進程,為了直觀用stat查看,兩個檔案分別是之前make編譯出的aaa.txt和touch建立的bbb.txt,預設許可權都是644
650) this.width=650;" title="未命名.jpg" src="http://s3.51cto.com/wyfs02/M01/41/74/wKiom1PV8E7gowBxAABU9F_xssM629.jpg" alt="wKiom1PV8E7gowBxAABU9F_xssM629.jpg" />
如果需要使建立的檔案許可權為代碼參數中指定的許可權,那麼只要把umask設定為0
650) this.width=650;" title="未命名.jpg" src="http://s3.51cto.com/wyfs02/M02/41/79/wKioL1PV88HxM2ugAACPrMG_418776.jpg" alt="wKioL1PV88HxM2ugAACPrMG_418776.jpg" />
總結:1.進程具有繼承許可權的特點。
2.一個檔案的許可權是受到open函數的參數和當前shell的umask值共同影響的。
也許會有人要問,touch命令會用到open函數了嗎?那麼strace下看看,很明顯的結果,預設是0666減去umask的許可權。
650) this.width=650;" title="未命名.jpg" src="http://s3.51cto.com/wyfs02/M00/41/7A/wKiom1PV9CvShayAAAI-IlFe07A971.jpg" alt="wKiom1PV9CvShayAAAI-IlFe07A971.jpg" />
本文出自 “老徐的私房菜” 部落格,轉載請與作者聯絡!