linux/unix编程手册-16_20
生活随笔
收集整理的這篇文章主要介紹了
linux/unix编程手册-16_20
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
title: linux/unix編程手冊(cè)-16_20 date: 2018-06-06 11:53:07 categories: programming tags: tips
linux/unix編程手冊(cè)-16(擴(kuò)展屬性EA)
EA的命名空間
- user EA 只適用于文件或目錄 (ext2~4上創(chuàng)建時(shí)需要:mount -o user_xattr device dir)
- trusted
- system
- security 略
linux/unix編程手冊(cè)-17(訪問(wèn)控制表)
ACL
- 文件系統(tǒng)支持ACL需要 mount -o acl
- 簡(jiǎn)單來(lái)說(shuō)ACL是對(duì)原有文件系統(tǒng)權(quán)限的擴(kuò)展
- 原有文件系統(tǒng)只針對(duì)owner,group和other, ACL支持對(duì)單獨(dú)用戶進(jìn)行權(quán)限設(shè)置
- ACL由一系列ACE組成,ACE由三部分組成
- 標(biāo)記類(lèi)型
- 標(biāo)記限定符(可選,一般為用戶ID或組ID,下圖帶-表示不可選,同時(shí)只存在一條此類(lèi)型)
- 權(quán)限集合
- 示例
- 最小ACL:和普通文件權(quán)限集合一樣只包含ACL_XX_OBJ, ACL_OTHER
ACL檢查算法
- 進(jìn)程具有特權(quán),執(zhí)行權(quán)限需要至少一條ACL匹配才有,其他同普通文件權(quán)限
- 進(jìn)程的有效用戶ID(準(zhǔn)確是文件ID下面略)匹配文件的屬主,授予ACL_USER_OBJ的ACE指定權(quán)限
- 進(jìn)程的有效用戶ID匹配了一條ACL_USER,授予權(quán)限為ACL_MASK & ACE指定
- 進(jìn)程組匹配類(lèi)似(有效組ID和輔助組任意一匹配,只是匹配了ACL_GROUP_ACE后權(quán)限需要& ACL_MASK)
- ACL_OTHER 授予的權(quán)限
chmod之后ACL_MASK的作用及其他api調(diào)用 略太雜了之后有使用再記吧
linux/unix編程手冊(cè)-18(目錄和(硬)鏈接)
目錄和硬鏈
目錄的inode示例
- inode可能會(huì)有多個(gè)文件名(多個(gè)硬鏈接),無(wú)法通過(guò)描述符找到文件名
- inode僅在同一文件系統(tǒng)中唯一,硬鏈得在同一文件系統(tǒng)
- inode目錄無(wú)法硬鏈
軟連接(符號(hào)鏈接)
- _POSIX_SYMLOOP_MAX_ 解引用操作限制<limits.h>
- 軟鏈存儲(chǔ)的優(yōu)化,路徑名小于60時(shí)可以直接存在存data指針的位置
- l開(kāi)頭的系統(tǒng)調(diào)用往往操作的符號(hào)鏈接文件本身(但是文件的目錄如果是軟鏈,則都會(huì)解引用)
- 除了sticky設(shè)置的目錄下的軟鏈文件(/tmp)進(jìn)行刪除和重命名的情況外,文件的操作的權(quán)限為解引用之后的文件權(quán)限。
- 硬鏈了一個(gè)軟鏈,linux不會(huì)解引用,MAC會(huì)。
文件的刪除
即使所有指向這個(gè)inode的硬鏈都解除了,但是又進(jìn)程持有改文件的描述符(因?yàn)榭梢酝ㄟ^(guò)打開(kāi)文件的表找到對(duì)應(yīng)的inode),在關(guān)閉描述符之前,系統(tǒng)實(shí)際不會(huì)刪除改文件
- tmpfile 的實(shí)現(xiàn)大致應(yīng)該類(lèi)似
目錄的操作略
進(jìn)程目錄的操作略
linux/unix編程手冊(cè)-19(監(jiān)控文件事件)
inotify API
// return inotify fd int inotify_init(void);// return wd; need read privellege on pathname int inotify_add_watch(int fd, const char *pathname, uint32_t mask);// 刪除fd里面的wd int inotify_rm_watch(int fd, uint32_t wd);復(fù)制代碼-
fd,wd一對(duì)多
-
每次調(diào)用read 讀取fd ,如果不傳O_NONBLOCK會(huì)阻塞,傳參的話read會(huì)立刻失敗并報(bào)錯(cuò)EAGAIN
- 在事件隊(duì)列末尾追加一個(gè)新事件會(huì)和當(dāng)前對(duì)尾比較,如果struct一致,則合并,忽略多次。
- /proc/sys/fs/inotify/保存inotify的各種限制
- max_queue_events
- max_user_instances
- max_user_watches
linux/unix編程手冊(cè)-20(信號(hào):基本概念)
信號(hào)是事件發(fā)生時(shí)對(duì)進(jìn)程的通知機(jī)制:也叫軟件中斷
信號(hào)通常源于內(nèi)核
- 硬件發(fā)生異常:被0除,內(nèi)存訪問(wèn)錯(cuò)誤等
- 用戶鍵入產(chǎn)生異常特殊字符:Ctrl+c,Ctrl+z
- 軟件事件:CPU時(shí)間超時(shí)等等
信號(hào)的分類(lèi)
- 標(biāo)準(zhǔn)信號(hào)(內(nèi)核像進(jìn)程通知事件,通常是1-31)
- 實(shí)時(shí)信號(hào)
進(jìn)程對(duì)信號(hào)的反饋
- 忽略信號(hào)
- 殺死進(jìn)程(非調(diào)用exit終止)
- 產(chǎn)生核心轉(zhuǎn)儲(chǔ)文件并終止
- 停止進(jìn)程
- 恢復(fù)停止
- 采取默認(rèn)(用于恢復(fù)對(duì)默認(rèn)的修改)
- 忽略默認(rèn)終止信號(hào)
- 執(zhí)行編寫(xiě)的信號(hào)處理程序(如Ctrl+c, 無(wú)法直接設(shè)置處理程序殺死進(jìn)程或產(chǎn)生核心轉(zhuǎn)儲(chǔ)文件,可以通過(guò)間接調(diào)用abort來(lái)產(chǎn)生新的信號(hào))
信號(hào)類(lèi)型和默認(rèn)行為
- SIGABRT: 調(diào)用abort()會(huì)產(chǎn)生,會(huì)殺死進(jìn)程并產(chǎn)生核心轉(zhuǎn)儲(chǔ)文件供調(diào)試
- SIGALARM: 調(diào)用alarm()或setitimer()設(shè)置定時(shí)器到時(shí)間,內(nèi)核會(huì)產(chǎn)生該信號(hào)
- SIGBUS: 內(nèi)存訪問(wèn)錯(cuò)誤
- SICHLD|SIGCLD: 子進(jìn)程終止時(shí)發(fā)給父進(jìn)程
- SIGCONT: 恢復(fù)停止進(jìn)程
- .......
- SIGTERM:標(biāo)準(zhǔn)殺死進(jìn)程信號(hào)kill|killall 會(huì)發(fā)起
- SIGKILL: 必殺信號(hào),處理程序無(wú)法將其阻塞,忽略或 捕獲(測(cè)試下);kill -9|kill -KILL會(huì)調(diào)用
改變信號(hào)
void ( *signal(int sig, void (*handler)(int))) (int);//成功返回之前的調(diào)用函數(shù)地址或者SIG_DFL(設(shè)為默認(rèn)值)或SIF_IGN(忽略),失敗時(shí)返回SIG_ERR //正常開(kāi)發(fā)不要使用signal,兼容性不好 復(fù)制代碼 static void sigHandler(int sig){printf("Ouch\n"); }int main(void){if (signal(SIGINT, sigHandler)==SIG_ERR){printf("error");exit(-1);}for (;;){printf("*****************************");sleep(3);} }復(fù)制代碼發(fā)送信號(hào)
int kill(pid_t pid, int sig); 復(fù)制代碼- pid>0, 發(fā)送給pid進(jìn)程
- pid=0, 發(fā)送給同組所有進(jìn)程
- pid<-1, 發(fā)送給pid絕對(duì)值進(jìn)程組內(nèi)所有進(jìn)程
- pid=-1 發(fā)送給除了init進(jìn)程和自身之外的所有有權(quán)進(jìn)程
發(fā)送的權(quán)限
- 特權(quán)進(jìn)程可以發(fā)給所有
- root用戶和組運(yùn)行的init進(jìn)程,僅接受安裝了處理器函數(shù)的信號(hào)
- 非特權(quán)進(jìn)程
- SIGCONT信號(hào)忽視用戶ID檢測(cè),非特權(quán)進(jìn)程可以向會(huì)話內(nèi)任意進(jìn)程發(fā)送這一信號(hào)
sig=0,僅報(bào)告進(jìn)程是否存在
其他發(fā)送信號(hào)調(diào)用
int raise(int sig); //單線程下等于 kill(getpid(), sig) //支持線程系統(tǒng)下 pthread_kill(pthread_self(),sig)int killgp(pid_t pgrp, int sig); //等同于 kill(-pgrp, sig) 復(fù)制代碼信號(hào)集
// 初始化空的set int sigemptyset(sigset_t *set);// 初始化包含所有信號(hào)(包括實(shí)時(shí)信號(hào))的set int sigfillset(sigset_t *set);int sigaddset(sigset_t *set, int sig);int sigdelset(sigset_t *set, int sig);int sigismember(const sigset_t *set, int sig); 復(fù)制代碼 int sigandset(sigset_t *dest, sigset_t *left, sigset_t *right);int sigorset(sigset_t *dest, sigset_t *left, sigset_t *right);int sigisemptyset(const sigset_t *set);復(fù)制代碼信號(hào)掩碼
內(nèi)核會(huì)為每個(gè)進(jìn)程維護(hù)一個(gè)信號(hào)掩碼,即一組信號(hào),并阻塞這些信號(hào)對(duì)進(jìn)程的傳遞,一直延遲直至解除(每個(gè)線程可單獨(dú)控制)
int sigprocmask(int how, const sigset_t *set, sigset_t *old_set);// how=SIG_BLOCK, 當(dāng)前進(jìn)程和set取并集 // how=SIG_UNBLOCK, 移除set內(nèi)信號(hào) // how=SIG_SETMASK, 賦值為set內(nèi)信號(hào) // oldset不為空則指向之前的信號(hào)掩碼 // set為空不做改動(dòng)復(fù)制代碼 int main(void){sigset_t blockSet, prevMask;sigemptyset(&blockSet);sigaddset(&blockSet, SIGINT);if (sigprocmask(SIG_BLOCK, &blockSet, &prevMask)==-1){exit(-1);}if (sigprocmask(SIG_SETMASK, &prevMask, NULL) == -1){exit(-1);}retunn 0; } 復(fù)制代碼獲取等待信號(hào)
int sigpending(sigset_t *set);// 標(biāo)準(zhǔn)信號(hào)同一信號(hào)只會(huì)記錄一次,實(shí)時(shí)信號(hào)之后會(huì)有排隊(duì)處理見(jiàn)22章 復(fù)制代碼改變信號(hào)二
int sigaction(int sig, const struct sigaction *act, struct sigaction *oldact);//act 新處置的數(shù)據(jù)結(jié)構(gòu),為NULL則忽略,oldact置位將當(dāng)前處置struct sigaction{void (*sa_handler)(int); // 調(diào)用函數(shù)地址或者SIG_DFL,SIF_IGN, 為函數(shù)地址時(shí)sa_mask和sa_flags才有效sigset_t sa_mask; //調(diào)用函數(shù)時(shí)可額外阻塞一組信號(hào)int sa_flags; //略....太多標(biāo)記了void (*sa_restorer)(void); //系統(tǒng)內(nèi)部使用,供恢復(fù)上下文 } 復(fù)制代碼- 執(zhí)行處理器程序時(shí),同一信號(hào)第二次到達(dá),如果沒(méi)有設(shè)為阻塞會(huì)忽略,設(shè)為阻塞的話會(huì)保留一次
總結(jié)
以上是生活随笔為你收集整理的linux/unix编程手册-16_20的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 单表操作
- 下一篇: 感恩老板最暖心一段话67句