在西寧做網(wǎng)站可以嗎推廣員是做什么的
1.僵死進(jìn)程(僵尸進(jìn)程):
1.僵死進(jìn)程產(chǎn)生的原因或者條件:
什么是僵死進(jìn)程?
當(dāng)子進(jìn)程先于父進(jìn)程結(jié)束,父進(jìn)程沒有獲取子進(jìn)程的退出碼,此時子進(jìn)程變成僵死進(jìn)程.
簡而言之,就是子進(jìn)程先結(jié)束,并且父進(jìn)程沒有獲取它的退出碼;
那么僵死進(jìn)程產(chǎn)生的原因或者條件就是:子進(jìn)程先于父進(jìn)程結(jié)束,并且父進(jìn)程沒有獲取子進(jìn)程的退出碼;
2.進(jìn)程結(jié)束的過程以及僵死進(jìn)程產(chǎn)生的過程:
3.觀察僵死進(jìn)程:
父進(jìn)程執(zhí)行7次,子進(jìn)程改為3次;就能觀察到僵死進(jìn)程(放到后臺運(yùn)行&,ps -f);
4.處理僵死進(jìn)程
(1)父進(jìn)程先結(jié)束(子進(jìn)程會變成孤兒進(jìn)程,孤兒進(jìn)程會被收養(yǎng)(紅帽子是init(pid==1)收養(yǎng)孤兒進(jìn)程,Unbuntu是操作系統(tǒng)指定了一個進(jìn)程));
(2)父進(jìn)程調(diào)用wait()方法獲取子進(jìn)程的退出碼;
本質(zhì):都是調(diào)用了wait方法;
代碼演示:
方法一:父進(jìn)程先結(jié)束//就是把父進(jìn)程的n=3,子進(jìn)程的n=7即可;
方法二:顯示的調(diào)用wait:
else
{
? ? s="parent";
? ? n=7;
? ? int val=0;
? ? wait(&val);
? ? printf("val=%d\n",val);
}
但是兩種方法都有區(qū)別:就是父進(jìn)程調(diào)用wait會阻塞,等子進(jìn)程執(zhí)行完之后,父進(jìn)程才會去執(zhí)行;
5.處理僵死進(jìn)程的意義;
僵死進(jìn)程的壞處:白白消耗內(nèi)存;(講服務(wù)器代碼的時候會演示)
Linux內(nèi)核設(shè)計與實(shí)現(xiàn)27頁;
6.退出碼
改代碼:exit(3);
執(zhí)行顯示val=768;
man 2 wait
WIFEXITED:正常退出的狀態(tài);
WEXITSTATUS:獲取退出碼;
? ? else//父進(jìn)程
? ? { ??
? ? ? ? s="parent";
? ? ? ? n=7;
? ? ? ? int val=0;
? ? ? ? wait(&val);
? ? ? ? if(WIFEXITED(val))
? ? ? ? {
? ? ? ? ?printf("val=%d\n",WEXITSTATUS(val));
? ? ? ? }
? ? }
7.避免僵死進(jìn)程的方法總結(jié)
1)父進(jìn)程先結(jié)束;
2)父進(jìn)程調(diào)用wait()方法獲取子進(jìn)程的退出碼;
其實(shí)兩種處理僵死進(jìn)程的方法本質(zhì)都是一樣的,都調(diào)用了wait獲取子進(jìn)程退出碼(方法一是父進(jìn)程先結(jié)束后子進(jìn)程被Init(現(xiàn)在隨著內(nèi)核的發(fā)展不一定是1)收養(yǎng),Init之后調(diào)用wait獲取子進(jìn)程退出碼;方法二是父進(jìn)程直接調(diào)用wait,)但是兩種方法又有區(qū)別,就是父進(jìn)程調(diào)用wait會阻塞,等子進(jìn)程執(zhí)行完之后,父進(jìn)程才會執(zhí)行.
若想父進(jìn)程調(diào)用wait不阻塞,那么我們需要結(jié)合信號一起.具體在信號那一節(jié)用代碼演示;
2.Linux操作文件的底層系統(tǒng)調(diào)用:
C語言操作文件的幾個庫函數(shù):fopen,fread,fwrite,fclose;
系統(tǒng)調(diào)用:open,read,write,close;
系統(tǒng)調(diào)用方法實(shí)現(xiàn)在內(nèi)核中;(陷入內(nèi)核,切換到內(nèi)核)
1.open的介紹:
open重載:兩個參數(shù)用于打開一個已經(jīng)存在的文件;三個參數(shù)的用于新建一個文件,并設(shè)置訪問權(quán)限;
pathname:文件和路徑和名稱;
flags:文件的打開方式;
mode:文件的權(quán)限,如"0600";
了解特殊權(quán)限:linux系統(tǒng)中,文件的三種特殊權(quán)限_rwsr是什么權(quán)限-CSDN博客
關(guān)于linux權(quán)限s權(quán)限和t權(quán)限詳解_目錄權(quán)限t_D_R_L_T的博客-CSDN博客
open的返回值為int,稱為文件描述符;
flags的打開標(biāo)志,如:
O_WRONLY:只寫打開;
O_RDONLY:只讀打開;
O_RDWR:讀寫方式打開;
O_CREAT:文件不存在則創(chuàng)建;
O_APPEND:文件末尾追加;
O_TRUNC:清空文件,重新寫入;
open的返回值是int,稱之為"文件描述符";每打開一個文件,我們就會得到一個文件描述符,這個文件描述符是一個整型,通過文件描述符就可以對文件進(jìn)行讀寫這樣的操作.open失敗返回-1,成功返回一個大于等于0的值; ?0,1,2是默認(rèn)打開的;
0:標(biāo)準(zhǔn)輸入
1:標(biāo)準(zhǔn)輸出
2:標(biāo)準(zhǔn)錯誤輸出
2.write 的介紹
fd:對應(yīng)打開的文件描述符
buf:寫入的文件內(nèi)容;
count:要寫入多少個字節(jié);
返回值:ssize_t:實(shí)際寫入了多少個字節(jié);
3.read:
fd:對應(yīng)打開的文件描述符;
buf:把文件內(nèi)容讀取到一塊空間buf中;
count:期望要讀取的字節(jié)數(shù);
返回值:ssize_t:實(shí)際讀取了多少個字節(jié);
4.close的介紹
關(guān)閉文件描述符;
5.文件描述符:
文件打開以后,內(nèi)核給文件的一個編號;(>0的整數(shù))
0:標(biāo)準(zhǔn)輸入;
1:標(biāo)準(zhǔn)輸出;
2:標(biāo)準(zhǔn)錯誤輸出;
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
? ? write(1,"hello",5);
? ? exit(0);
}
//往屏幕(標(biāo)準(zhǔn)輸出)寫入hello 5個字節(jié)