關閉 linux下的umask( )函式、setsid( )函式

2puT發表於2016-07-12
   umask()函式:此函式的主要作用是在建立檔案時設定或者遮蔽掉檔案的一些許可權。一般與open()函式配合使用。open函式原型:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
當建立一個檔案並且要明確指定此檔案的許可權時,應該使用第二個open()函式,明確指定mode引數,所建立的檔案最後的許可權是:mode&(~mask)。預設的mask值是:022
例:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
        int fd;
//      umask(0026);
        fd = open("/home/zhangcheng/share/test/test.txt",O_RDWR|O_CREAT,0666);
        if(fd < 0)
                perror("open");
        return 0;
}

則生成的test.txt檔案的許可權是:666&(~026)結果是:-rw-r-----。如果沒有umask(0026);這條語句,則生成的test.txt檔案的許可權是:666&(~022)結果是:-rw-r--r--。注:open函式的mode引數只有在建立檔案時才有效。

      setsid( )說明:程式從它的雙親程式獲得它的對話過程和程式組識別號。setsid()就是將程式和它當前的對話過程和程式組分離開,並且把它設定成一個新的對話過程的領頭程式。
pid_t pid = fork();
if (pid == 0) {
        ...
        int result = execl(path, "adb", "fork-server", "server", NULL);
} else {
        // run a program in a new session
        setsid();//之前parent和child執行在同一個session裡,而且parent是session頭,
        //所以作為session頭的parent如果exit結束執行的話,那麼會話session組中的所有程式將都被殺死;
        //所以執行setsid()之後,parent將重新獲得一個新的會話session組id,child將仍持有原有的會話session組,
        //這時parent退出之後,將不會影響到child了。
}
      會話session是一個或多個程式組的集合。程式呼叫setsid函式建立一個新會話。如果呼叫此函式的程式不是一個程式組的組長,則此函式就會建立一個新會話,該程式變成會話的首程式,然後該程式成為一個新程式組的組長程式,該程式沒有控制終端。因為會話首程式是具有唯一程式ID的單個程式,所以可以將會話首程式的程式ID視為會話Id。
sys.c中的建立一個會話的系統呼叫
int sys_setsid(void)
{
       ...
       current->leader = 1;
       current->session = current->pgrd = current->pid;  //建立該會話的程式號賦值成為會話號
       current->tty = -1;    //表示該領頭程式沒有控制終端。
       ...
}

參考原文:http://hi.chinaunix.net/?uid-20693307-action-viewspace-itemid-46100

相關文章