中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

凡科網(wǎng)做網(wǎng)站網(wǎng)站策劃報(bào)告

凡科網(wǎng)做網(wǎng)站,網(wǎng)站策劃報(bào)告,女人吃男人做床視頻網(wǎng)站,阿里云域名注冊(cè)及備案文章目錄 一.子進(jìn)程的創(chuàng)建操作系統(tǒng)內(nèi)核視角下的父子進(jìn)程存在形式驗(yàn)證子進(jìn)程對(duì)父進(jìn)程數(shù)據(jù)的寫(xiě)時(shí)拷貝 二.進(jìn)程等待進(jìn)程非阻塞等待示例: 三.進(jìn)程替換內(nèi)核視角下的進(jìn)程替換過(guò)程:綜合利用進(jìn)程控制系統(tǒng)接口實(shí)現(xiàn)簡(jiǎn)單的shell進(jìn)程 進(jìn)程控制主要分為三個(gè)方面,分別是:子進(jìn)程的創(chuàng)建,進(jìn)程等待…

在這里插入圖片描述

文章目錄

  • 一.子進(jìn)程的創(chuàng)建
      • 操作系統(tǒng)內(nèi)核視角下的父子進(jìn)程存在形式
      • 驗(yàn)證子進(jìn)程對(duì)父進(jìn)程數(shù)據(jù)的寫(xiě)時(shí)拷貝
  • 二.進(jìn)程等待
      • 進(jìn)程非阻塞等待示例:
  • 三.進(jìn)程替換
      • 內(nèi)核視角下的進(jìn)程替換過(guò)程:
      • 綜合利用進(jìn)程控制系統(tǒng)接口實(shí)現(xiàn)簡(jiǎn)單的shell進(jìn)程

進(jìn)程控制主要分為三個(gè)方面,分別是:子進(jìn)程的創(chuàng)建,進(jìn)程等待,進(jìn)程替換
在這里插入圖片描述

一.子進(jìn)程的創(chuàng)建

  • 父進(jìn)程調(diào)用fork()系統(tǒng)接口創(chuàng)建子進(jìn)程后,操作系統(tǒng)會(huì)為子進(jìn)程創(chuàng)建獨(dú)立的PCB結(jié)構(gòu)體虛擬地址空間mm_struct,因此父子進(jìn)程之間具有互相獨(dú)立性

操作系統(tǒng)內(nèi)核視角下的父子進(jìn)程存在形式

  • 父進(jìn)程調(diào)用fork()函數(shù)之后:在這里插入圖片描述

驗(yàn)證子進(jìn)程對(duì)父進(jìn)程數(shù)據(jù)的寫(xiě)時(shí)拷貝

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main(int argc,const char * argv[])
{//創(chuàng)建子進(jìn)程pid_t id = fork();if(id < 0){//創(chuàng)建子進(jìn)程失敗,退出主函數(shù)perror("fork");return 0;}else if(id == 0)  {//子進(jìn)程執(zhí)行流//子進(jìn)程對(duì)變量g_val進(jìn)行修改,引發(fā)寫(xiě)時(shí)拷貝g_val=100;printf("childProcess[%d]: %d : %p\n", getpid(), g_val, &g_val);}else{//父進(jìn)程的執(zhí)行流//父進(jìn)程先休眠3秒,讓子進(jìn)程先完成g_val變量的寫(xiě)入sleep(3);printf("parentProcess[%d]: %d : %p\n", getpid(), g_val, &g_val);}sleep(1);return 0;
}
  • 執(zhí)行結(jié)果:在這里插入圖片描述
  • 內(nèi)核視角下,代碼段中的寫(xiě)時(shí)拷貝圖解:在這里插入圖片描述
    在這里插入圖片描述
  • 寫(xiě)時(shí)拷貝保證了父子進(jìn)程之間互相獨(dú)立的同時(shí)提高了計(jì)算機(jī)整機(jī)的內(nèi)存使用效率

二.進(jìn)程等待

  • 子進(jìn)程退出后會(huì)進(jìn)入僵尸狀態(tài),僵尸狀態(tài)進(jìn)程的內(nèi)核數(shù)據(jù)結(jié)構(gòu)對(duì)象會(huì)保留在操作系統(tǒng)內(nèi)核空間中,在父進(jìn)程讀取子進(jìn)程的退出信息后,操作系統(tǒng)才會(huì)釋放掉子進(jìn)程所占用的所有系統(tǒng)資源
    • 若父進(jìn)程比子進(jìn)程先退出,那么操作系統(tǒng)就會(huì)接管子進(jìn)程(成為孤兒進(jìn)程),子進(jìn)程退出后,操作系統(tǒng)會(huì)自動(dòng)讀取子進(jìn)程的退出信息.
  • 父進(jìn)程讀取子進(jìn)程的退出信息這一過(guò)程稱(chēng)為進(jìn)程等待
  • 進(jìn)程等待常用系統(tǒng)接口:int waitpid(int pid, int *status, int options);
    • 形參int pid:在這里插入圖片描述

    • 形參int *status:用于記錄進(jìn)程退出碼和退出信號(hào)的輸出型參數(shù)

    • 形參int options表示進(jìn)程等待的方式:主要分為阻塞等待非阻塞等待兩大類(lèi):

      • 當(dāng)option0時(shí):進(jìn)程執(zhí)行阻塞等待,此時(shí)進(jìn)程會(huì)進(jìn)入阻塞狀態(tài)(PCB退出運(yùn)行隊(duì)列,進(jìn)入阻塞隊(duì)列),直到其所等待的子進(jìn)程退出,該進(jìn)程才會(huì)重新進(jìn)入運(yùn)行狀態(tài)讀取子進(jìn)程的退出信息
      • 當(dāng)option為非零時(shí)(比如使用系統(tǒng)宏WNOHANG):進(jìn)程執(zhí)行非阻塞等待, 此時(shí)進(jìn)程會(huì)嘗試讀取其子進(jìn)程的退出信息,若沒(méi)能讀取到子進(jìn)程的退出信息,則waitpid系統(tǒng)接口立即返回0
    • 返回值int:若waitpid系統(tǒng)接口讀取到子進(jìn)程的退出信息,返回子進(jìn)程的pid,若waitpid執(zhí)行過(guò)程中出現(xiàn)錯(cuò)誤,則返回-1

進(jìn)程非阻塞等待示例:

#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>int main()
{int pid = 0;//創(chuàng)建子進(jìn)程pid = fork();if(pid == -1){//子進(jìn)程創(chuàng)建失敗printf("fork failed\n");return -1;}else if(pid == 0){//子進(jìn)程的代碼執(zhí)行流int cnt = 5;while(cnt--){sleep(1);printf("child process running\n");}exit(11);}else{//父進(jìn)程的代碼執(zhí)行流//非阻塞等待子進(jìn)程int status = 0;bool quit = 0;while(quit == 0){//循環(huán)非阻塞等待子進(jìn)程int res =  waitpid(pid,&status,WNOHANG);if(res > 0){//子進(jìn)程已退出printf("waiting pid success,chilProc exit,退出碼:%d\n",WEXITSTATUS(status));quit = 1;}else if(res == 0){//子進(jìn)程還未退出printf("waiting pid success,childProc still running\n");}else{//等待發(fā)生錯(cuò)誤printf("waiting pid failed\n");}sleep(1);}}return 0;
}

在這里插入圖片描述

三.進(jìn)程替換

  • 進(jìn)程替換的概念:通過(guò)特定的系統(tǒng)調(diào)用接口,操作系統(tǒng)可以將進(jìn)程當(dāng)前執(zhí)行的代碼段替換成指定系統(tǒng)路徑下其他可執(zhí)行程序的代碼段,然后根據(jù)進(jìn)程從頭開(kāi)始執(zhí)行新的代碼段(因此需要通過(guò)進(jìn)程替換系統(tǒng)接口為新代碼段傳入main函數(shù)命令行參數(shù))

內(nèi)核視角下的進(jìn)程替換過(guò)程:

在這里插入圖片描述
在這里插入圖片描述

  • 可見(jiàn)進(jìn)程替換并不是創(chuàng)建新的進(jìn)程(進(jìn)程的PCB虛擬內(nèi)存結(jié)構(gòu)體不變)
  • 進(jìn)程替換系統(tǒng)接口:
    在這里插入圖片描述
  • 形參和返回值統(tǒng)一解釋:
    • 參數(shù)const char*path:表示將要替換現(xiàn)有代碼段的目標(biāo)可執(zhí)行程序的完整路徑
    • 參數(shù)const char*file:表示將要替換現(xiàn)有代碼段的目標(biāo)可執(zhí)行程序的文件名,其系統(tǒng)路徑由環(huán)境變量PATH決定
    • 參數(shù)const char*arg,...:表示傳給新代碼段main函數(shù)命令行參數(shù)的字符串,...表示可變參數(shù)列表,可以傳入多個(gè)字符串,最后一個(gè)字符串需傳入NULL
    • 參數(shù)char *const argv[]:表示傳給新代碼段main函數(shù)命令行參數(shù)的字符串?dāng)?shù)組,數(shù)組中最后一個(gè)字符串需傳入NULL
    • 參數(shù)cahr*const envp[]:表示傳遞給新代碼段的環(huán)境變量字符串?dāng)?shù)組
    • 當(dāng)進(jìn)程替換失敗時(shí),exec系列系統(tǒng)接口會(huì)返回-1

綜合利用進(jìn)程控制系統(tǒng)接口實(shí)現(xiàn)簡(jiǎn)單的shell進(jìn)程

  • shell進(jìn)程的運(yùn)行原理:shell進(jìn)程接收到用戶(hù)輸入的指令后,對(duì)指令進(jìn)行格式化處理,然后創(chuàng)建子進(jìn)程,子進(jìn)程通過(guò)exec系列系統(tǒng)接口將自身替換成系統(tǒng)命令并執(zhí)行以響應(yīng)用戶(hù)需求,shell進(jìn)程的這種運(yùn)行機(jī)制保證了自身的進(jìn)程安全(子進(jìn)程出現(xiàn)錯(cuò)誤不會(huì)影響到父進(jìn)程的運(yùn)行)
    在這里插入圖片描述
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <memory.h>//用戶(hù)輸入的命令行的最大長(zhǎng)度
#define CStrLen 1024
//解析命令行得到的格式化字符串?dāng)?shù)組
#define SStrLen 50
//命令行字符串
char CommStr[CStrLen];
//格式化命令行字符串?dāng)?shù)組
char*  StdStr[SStrLen];//命令行分隔符
#define Sep " "
//操作系統(tǒng)配置的環(huán)境變量
extern char ** environ;
int main()
{while(1) {printf("[我的命令行解釋器 myshell]$ ");fflush(stdout);memset(CommStr,'\0',sizeof StdStr);//獲取用戶(hù)輸入命令if(fgets(CommStr,sizeof CommStr,stdin)== NULL){continue;}CommStr[strlen(CommStr)-1] = '\0';StdStr[0] = strtok(CommStr,Sep);//根據(jù)空格對(duì)用戶(hù)輸入的字符串進(jìn)行分割并存入StdStr字符串?dāng)?shù)組中int i = 1;while(StdStr[i++] = strtok(NULL,Sep));//部分命令(比如cd命令)需要由shell進(jìn)程自己來(lái)執(zhí)行if(strcmp(StdStr[0],"cd")== 0){//用chdir函數(shù)改變shell進(jìn)程的工作路徑if(StdStr[1] != NULL){chdir(StdStr[1]);}continue;}//shell創(chuàng)建子進(jìn)程來(lái)執(zhí)行系統(tǒng)命令int pid = fork();if(pid == 0){//printf("shell的子進(jìn)程執(zhí)行系統(tǒng)命令:\n");execvp(StdStr[0],StdStr);printf("-mybash: %s: command execute failed\n",StdStr[0]);exit(-1);}else{int status;//父進(jìn)程進(jìn)行阻塞等待,等待子進(jìn)程執(zhí)行完系統(tǒng)命令結(jié)束并獲取其退出碼int waitres = waitpid(pid,&status,0);if(waitres == -1){printf("waitchild process failed\n");}}}return 0;
}

在這里插入圖片描述
在這里插入圖片描述

http://m.risenshineclean.com/news/59720.html

相關(guān)文章:

  • 網(wǎng)站建設(shè) 方案書(shū)網(wǎng)絡(luò)平臺(tái)怎么推廣
  • 同一個(gè)網(wǎng)站可以同時(shí)做競(jìng)價(jià)和優(yōu)化百度熱門(mén)排行榜
  • 網(wǎng)站做導(dǎo)航的地圖seo模板建站
  • 惠州網(wǎng)站建設(shè) 翻譯6旅游搜索量環(huán)比增188%
  • 做文學(xué)網(wǎng)站用什么域名口碑營(yíng)銷(xiāo)怎么做
  • 商丘做網(wǎng)站哪家好上海廣告推廣
  • 網(wǎng)站開(kāi)發(fā)功能模塊出錯(cuò)seo課培訓(xùn)
  • 哪個(gè)網(wǎng)站做醫(yī)學(xué)培訓(xùn)好seo工作內(nèi)容和薪資
  • 浙江嘉興seo網(wǎng)站優(yōu)化推廣網(wǎng)絡(luò)推廣宣傳
  • 網(wǎng)站建設(shè)價(jià)格自動(dòng)點(diǎn)擊器怎么用
  • 廣西備案工信部網(wǎng)站營(yíng)銷(xiāo)型網(wǎng)站內(nèi)容
  • 潮州市住房和城鄉(xiāng)建設(shè)局網(wǎng)站站長(zhǎng)工具大全
  • b2b網(wǎng)站制作任務(wù)推廣引流平臺(tái)
  • wordpress 布局修改西安seo托管
  • 尋找網(wǎng)站建設(shè)_網(wǎng)站外包如何優(yōu)化網(wǎng)頁(yè)
  • 青島網(wǎng)站建設(shè)找潤(rùn)商大連seo按天付費(fèi)
  • 房地產(chǎn)行業(yè)網(wǎng)站跟我學(xué)seo從入門(mén)到精通
  • 重慶做網(wǎng)站價(jià)格百度一下首頁(yè)網(wǎng)址
  • 歐美網(wǎng)站建設(shè)排名北京網(wǎng)站seo服務(wù)
  • 如何在圖片上添加文字做網(wǎng)站網(wǎng)站備案查詢(xún)官網(wǎng)
  • 資源網(wǎng)站如何做網(wǎng)上開(kāi)店如何推廣自己的網(wǎng)店
  • 公司域名注冊(cè)網(wǎng)站哪個(gè)好合肥網(wǎng)絡(luò)推廣培訓(xùn)學(xué)校
  • 養(yǎng)生館室內(nèi)設(shè)計(jì)手機(jī)網(wǎng)站seo免費(fèi)軟件
  • 網(wǎng)站設(shè)計(jì)畢業(yè)論文任務(wù)書(shū)撫順優(yōu)化seo
  • 群暉ds1817做網(wǎng)站國(guó)外網(wǎng)站制作
  • 銅川公司做網(wǎng)站企業(yè)查詢(xún)系統(tǒng)官網(wǎng)
  • 南通網(wǎng)站優(yōu)化營(yíng)銷(xiāo)渠道模式有哪些
  • 做淘寶聯(lián)盟網(wǎng)站要多少錢(qián)建設(shè)網(wǎng)頁(yè)
  • 公司營(yíng)銷(xiāo)網(wǎng)站制作下載百度官方網(wǎng)站
  • 淫穢色情網(wǎng)站境外的南寧網(wǎng)站建設(shè)