91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux系統編程總結(1)

發布時間:2020-07-07 18:08:07 來源:網絡 閱讀:3055 作者:baiweibi 欄目:編程語言

一 進程概念

1.進程產生
  操作運行了一個程序,至少會產生一個進程

2.Linux 創建進程

struct task_struct
{
    進程號    (PID)
    父進程號  (PPID)
    運行地址空間
    一組寄存器值
    進程狀態
    ....
};

問題:進程與程序的區別?
回答:程序就是一個編譯好的可執行文件,而進程是操作系統為了執行一個程序而創建的,進程是程序的一次執行過程

二 進程相關的命令

1.ps -ef
查看進程的PID和PPID

2.ps aux
查看進程狀態 R:運行態  S:可中斷的等待態  D:不能中斷的等待態   T:停止態 Z:僵尸態(PID資源未釋放)

3.kill
<1>kill -l 查看系統中信號
<2>發送信號到指定的進程
   kill  -信號  PID
   例如:
   kill  -SIGSTOP   5207

4.killall
給同名的進程發信號

killall -信號  進程名

5.查看系統允許的最大進程個數
 cat /proc/sys/kernel/pid_max   -> 32768

三 創建子進程

pid_t fork(void);
功能:創建子進程
返回值:
成功給父進程返回子進程的PID,給子進程返回0,失敗返回-1

思考:如何創建子進程?
回答:復制父進程

僵尸進程:進程結束,但是父進程沒有對它進行收尸處理
孤兒進程:父親進程結束,子進程就會變成孤兒進程,孤兒進程會自動被init進程收養

問題:為什么創建子進程?
回答:創建子進程的目的是讓子進程執行獨立任務

問題:子進程和父進程會不會相互影響
回答:不會,父子進程的地址空間是獨立

練習:
創建兩個子進程,子進程1輸出"hello word"然后結束,
子進程2 進行while(1) , 父進程進行while(1)


四 父進程回收僵尸態子進程

pid_t wait(int *status);
功能:等待僵尸態子進程
參數:
@status  獲取僵尸態子進程狀態
返回值:
成功返回僵尸態子進程PID,失敗返回-1(沒有子進程)

常用用法: wait(NULL);

pid_t waitpid(pid_t pid, int *status, int options);
參數:
@pid     -1:等待任意一個子進程退出    子進程的PID:等待指定PID子進程
@status  獲取子進程退出的狀態 
@options 0:阻塞的方式調用    WNOHANG:非阻塞方式調用
返回值:
成功返回僵尸態子進程PID,失敗返回-1, 如果沒有子進程處于僵尸態,且非阻塞方式調用,此時立即返回,返回值為0

waitpid(-1,NULL,0);   => wait(NULL);
waitpid(pid,NULL,0);

waitpid(-1,NULL,WNOHANG);//常用的用法

waitpid(pid,NULL,WNOHANG);

五 結束一個進程

return  : 在main函數使用return,用來結束進程
_exit() : 用來結束一個進程
exit()  : 用來結束一個進程,刷新緩存

exit(EXIT_SUCCESS)  成功 
exit(EXIT_FAILURE)  失敗

例如:
fd = open(...);
if(fd < 0){
    fprintf(stderr,"...");
    exit(EXIT_FAILURE);
}

六 在一個進程中運行另外一個程序(啟動另外一個進程)

exec 函數族:
在一個進程中執行一個程序,替換原進程所有資源(代碼段,數據段, ...),只保留原進程的PID


bash執行程序的流程:
bash ---> < fork --->子進程 >---->調用exec函數族---->執行我們的可執行程序

int execl(const char *path, const char *arg, ...);
l : list
int execl(可執行文件路徑,可執行文件名,傳遞參數1,傳遞參數2,...,NULL);

例如:
執行/bin/ls ,傳遞的參數是-l
execl("/bin/ls","ls","-l",NULL);


p : path
int execlp(const char *file, const char *arg, ...);

例如:
執行/bin/ls ,傳遞的參數是-l
execlp("ls","ls","-l",NULL);


v:vetcor (參數存放在指針數組中)
int execv(const char *path, char *const argv[]);


例如:
執行/bin/ls ,傳遞的參數是-l

char *arg[] = {"ls","-l",NULL};
execv("/bin/ls",arg);

int execvp(const char *file, char *const argv[]);

int execle(const char *path, const char *arg, ..., char * const envp[]);
 


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

菏泽市| 汉川市| 山阳县| 荆门市| 梁平县| 樟树市| 湖北省| 华坪县| 随州市| 泽库县| 孟连| 大姚县| 西峡县| 澜沧| 冷水江市| 涡阳县| 钟祥市| 新竹县| 大邑县| 安远县| 巩留县| 石台县| 聂拉木县| 盐边县| 霍山县| 浠水县| 石林| 延庆县| 池州市| 衡南县| 八宿县| 葵青区| 台南县| 永宁县| 偏关县| 青田县| 上高县| 新民市| 福建省| 桦甸市| 湘西|