fcntl设置FD_CLOEXEC
原文地址:http://hi.baidu.com/passerryan/item/d81eac1671ce3d5cf0090e2b
這是fcntl的一個Flag標志。
fcntl(fd, F_SETFD, FD_CLOEXEC);
// 這里設置為FD_CLOEXEC表示當程序執行exec函數時本fd將被系統自動關閉,表示不傳遞給exec創建的新進程, 如果設置為fcntl(fd, F_SETFD, 0);那么本fd將保持打開狀態復制到exec創建的新進程中
FD_CLOEXEC用來設置文件的close-on-exec狀態標準。在exec()調用后,close-on-exec標志為0的情況,此文件不被關閉。非零則在exec()后被關閉。默認close-on-exec狀態為0,需要通過FD_CLOEXEC設置。
---------------------------------------------------------------------------------------------------------------
int flags;
int dummy = 0;
if ((flags = fcntl(fd, F_GETFL, dummy)) < 0){
??? debug(50, 0) ("FD %d: fcntlF_GETFL: %s\n", fd, xstrerror());
??? return;
}
if (fcntl(fd, F_SETFD,?flags | FD_CLOEXEC) <0)
?? debug(50, 0) ("FD %d: setclose-on-exec failed: %s\n", fd, xstrerror());
---------------------------------------------------------------------------------------------------------------
fcntl(文件描述詞操作)
相關函數
open,flock
表頭文件
#include<unistd.h>
#include<fcntl.h>
定義函數
int fcntl(int fd , int cmd);
int fcntl(int fd,int cmd,long arg);
int fcntl(int fd,int cmd,struct flock * lock);
函數說明
fcntl()用來操作文件描述詞的一些特性。參數fd代表欲設置的文件描述詞,參數cmd代表欲操作的指令。
有以下幾種情況:
F_DUPFD用來查找大于或等于參數arg的最小且仍未使用的文件描述詞,并且復制參數fd的文件描述詞。執行成功則返回新復制的文件描述詞。請參考dup2()。F_GETFD取得close-on-exec旗標。若此旗標的FD_CLOEXEC位為0,代表在調用exec()相關函數時文件將不會關閉。
F_SETFD 設置close-on-exec 旗標。該旗標以參數arg 的FD_CLOEXEC位決定。
F_GETFL 取得文件描述詞狀態旗標,此旗標為open()的參數flags。
F_SETFL設置文件描述詞狀態旗標,參數arg為新旗標,但只允許O_APPEND、O_NONBLOCK和O_ASYNC位的改變,其他位的改變將不受影響。
F_GETLK 取得文件鎖定的狀態。
F_SETLK 設置文件鎖定的狀態。此時flcok 結構的l_type值必須是F_RDLCK、F_WRLCK或F_UNLCK。如果無法建立鎖定,則返回-1,錯誤代碼為EACCES或EAGAIN。
F_SETLKW F_SETLK作用相同,但是無法建立鎖定時,此調用會一直等到鎖定動作成功為止。若在等待鎖定的過程中被信號中斷時,會立即返回-1,錯誤代碼為EINTR。參數lock指針為flock結構指針,定義如下
struct flcok
{
short int l_type;
short int l_whence;
off_t l_start;
off_t l_len;
pid_t l_pid;
};
l_type 有三種狀態:
F_RDLCK 建立一個供讀取用的鎖定
F_WRLCK 建立一個供寫入用的鎖定
F_UNLCK 刪除之前建立的鎖定
l_whence 也有三種方式:
SEEK_SET 以文件開頭為鎖定的起始位置。
SEEK_CUR 以目前文件讀寫位置為鎖定的起始位置
SEEK_END 以文件結尾為鎖定的起始位置。
返回值
成功則返回0,若有錯誤則返回-1,錯誤原因存于errno.
總結
以上是生活随笔為你收集整理的fcntl设置FD_CLOEXEC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pythonsort参数_Python
- 下一篇: java wsdl 参数必填设置