一、程序控制
1、開機後bootloader將系統的第乙個程序啟動了起來,bootloader是燒製在bios上的
2、第乙個例子:getpid
#include"func.h"
int main(int argc,char* ar**)
3、乙個程序有4個身份:真實使用者id、真實組id;有效使用者id、有效組id
(1)真實使用者id:getuid()
(2)真實組id:getgid()
(3)有效使用者id:geteuid()
(4)有效組id:getegid()
4、第二個例子:gid和uid的例子、euid和egid的例子
#include"func.h"
int main()
5、第三個例子modify_file.c
#include
int main(int argc,char* ar**)
6、s是許可權提公升
chmod u+s a.out 該命令可以實現許可權提公升
許可權提公升:在許可權控制中,使用許可權提公升後,也就是設定了該屬性後,使用者執行a.out時,a.out程序的有效使用者身份將不再是執行a.out的使用者,而是a.out檔案的所有者。
7、紅色的命令(可以實現許可權提公升):sudo、su、chmod u+s
命令chmod g+s a.out 對同組使用者進行許可權提公升
命令chmod o+t a.out 增加粘滯鍵,增加一些許可權檢查
8、如何修改真實使用者id?
介面setuid,該命令只有sudo許可權才可以執行
sudo實現的原理,提公升euid的許可權
使用命令man setuid獲取更多幫助
int setuid(uid_t uid);
int setgid(gid_t gid);
int seteuid(uid_t euid);
int setegid(gid_t egid);
9、在執行程式時,如果想讓進城在後台執行,可以使用命令 ./a.out & 該命令會返回程序的pid
同乙個程式可以啟動多次,故還可以繼續使用命令./a.out &
10、使用top檢視動態程序後,程序狀態的標誌如下:
r 兩次取樣之間是不是有時間片消耗
s 睡眠
t 暫停
z 殭屍程序
11、小技巧:
(1)使用命令ps -elf,可以檢視程序狀態
(2)通過who命令可以檢視當前有幾個使用者正在登陸及當前登陸使用者的詳細資訊
(3)命令which sudo ,可以檢視sudo命令所在的路徑
(4)在實際使用中,使用者環境分為:生產環境和測試環境
(5)使用命令free可以檢視磁碟當前使用狀態
(6)檢視某程序詳細資訊的命令ps -elf|grep [pid/程序名]
12、如何將其他使用者踢出去?
(1)使用命令ps -elf|grep luke
(2)將某異常使用者對應的程序殺掉,即可將該使用者退出
(3)殺掉程序使用命令kill -9 [pid]
13、ps的常用命令
(1)ps -elf
(2)ps -aux
看cpu的使用量、沒存使用量、stat狀態
(3)top
顯示前20條程序,動態的改變
(4)搜尋程序使用命令ps -elf|grep a.out
(5)ubuntu下,優先順序有140個優先順序(pri)。範圍是-40—99
(6)排程策略:
實時 sched_fifo sched_rr -40-59 高優先順序的先執行
普通排程策略 cfs sched_other 60-99
14、如何改變程序優先順序,使用命令renice -n +19
降低優先順序,優先順序號越低,優先順序越高。因此如果優先順序號變大,那麼優先順序降低
使用命令renice -n +40 -p -12234
殺死程序kill -9 [pid],或者使用命令pkill [程序名,例如a.out]
15、命令crontab,相當於windows下的定時任務,可以設定定時關機等功能
16、nfs是網路檔案系統network file system
17、在使用wait函式時,會提示缺少wait的定義,其實是缺少標頭檔案,應該在func.h中增加兩個標頭檔案#include
#include
18、在測試fork的程式中,是父程序輸出快,還是子程序輸出快?
答案是:父程序輸出快,子程序被建立後,需要重新去申請時間片,故還要重新去排程佇列末尾等待被排程。
19、**fork_stack.c
#include"func.h"
int main(int argc,char*ar**)
else
return 0;
}20、**例子fork_malloc.c
#include"func.h"
int main(int argc,char* ar**)
else
return 0;
}21、如何驗證父程序和子程序的檔案描述符是否一致,例子fork_open.c
#include
int main(int argc,char* ar**)
else
return 0;
}根據這個例子,證明了父程序執行速度較快,而子程序執行因為需要重新去佇列中排隊等待處理機,所以慢了一點
22、驗證**例子fork_open2.c,可以提高檔案讀寫速度(但是往往磁碟讀寫速度才是瓶頸)
#include
int main(int argc,char* ar**)
else
return 0;
}23、多執行緒寫檔案,使用mmap,使多個執行緒或程序,對記憶體進行操作
24、execl是直接將磁碟上的**,直接複製到當前程序的**段。這時候程式就會按照新的**去執行
25、**execl.c和print.c檔案,兩個檔案是呼叫關係
#include
int main(int argc,char* ar**)
execl("./print","niuniu","123","456",null);
會使用niuniu作為程序名
execl如果執行失敗,是可以看到那句you can't see me
26、execl有6個兄弟,他們實現的功能都相似,只是寫法不太一樣
27、**例子execv.c
(1)execv.c內容
#include
int main(int argc,char* ar**)
;execv("./print",args);
printf("you can't see me\n");
return 0;
}(2)print.c內容
#include
int main(int argc,char* ar**)
printf("i am print process\n");
while(1);
return 0;
}28、孤兒程序:父程序先於子程序退出,這時子程序就變成了乙個孤兒程序,該程序被init程序接管
29、子程序已經結束,但父程序還在忙碌,沒有**子程序的內容,這時候子程序就會程式設計乙個殭屍程序;殭屍程序的狀態**是z,殭屍程序的程序狀態是不可以再改變的
30、如何避免子程序變成殭屍程序?父程序應該是用wait函式定期**子程序
但是wait一次執行,只能**一次
wait的返回值是子程序的pid
wifexited是乙個巨集操作
怎麼看乙個引數是巨集還是函式?
33、exit和_exit的區別
(1)exit會呼叫退出處理函式,清空i/o緩衝
(2)_exit不會呼叫退出處理函式,也不會清空i/o緩衝,會直接呼叫exit系統呼叫退出
34、abort函式
使用者程序終止
**例子abort.c
#include
void print()
int main(int argc,char* ar**)
linux 學習第七天
一 bash 使用 for迴圈 while迴圈 1.1 批量新增使用者 1.2 檢視使用者是否存在 a cut d f 1 etc passwd b id dream id 使用者名稱 c ll home 檢視使用者目錄 1.3 批量刪除使用者 請謹慎操作 1.5 猜數字 1.6 判斷使用者輸入 1...
第七天學習
練習題 1 以下類定義中哪些是類屬性,哪些是例項屬性?class c num 0 def init self self.x 4 self.y 5 c.count 62 怎麼定義私有 法?3 嘗試執行以下 並解釋錯誤原因 4 按照以下要求定義乙個遊樂園門票的類,並嘗試計算2個 1個小孩平日票價。要求 ...
學習linux的第七天
這兩個檔案是linux系統中最重要的檔案之一。在linux系統裡輸入cat etc passwd head 如下圖 第乙個欄位為使用者名稱,它代表使用者賬號的字串。第二個字段存放的是該賬號的口令。這裡為什麼是x呢?早期的unix系統口令確實存放在這裡,但基於安全因素,後來就存放在 etc shado...