日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自主编写shell

發布時間:2023/11/30 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自主编写shell 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.替換原理

????用fork創建子進程后執行的是和父進程相同的程序(但有可能執行不同的代碼分支),子進程往往要調用一種exec函數以執行例外一個程序。當進程調用一種exec函數時,該進程的用戶空間代碼和數據完全被新程序替換,從新程序的啟動歷程開始執行。調用exec并不創建新進程,所以調用exec前后該進程的id并未變化

2.實現一個shell
#include<stdio.h> #include<sys/wait.h> #include<unistd.h> #include<stdlib.h> #include<string.h>int main() {char buf[1024] = { 0 };while(1){printf("mysell#");fflush(stdout);size_t s = read( 0, buf, sizeof( buf ) );if(s > 0){buf[s - 1] = '\0';printf("%s\n", buf);}char* start = buf;char* _argv[32];_argv[0] = buf;int i = 1;while(*start){if(*start == ' '){*start = '\0';start ++;_argv[i++] = start;}else{start ++;}}_argv[i] = NULL;pid_t pid;pid = fork();if(pid < 0){perror("fork");exit(1);}if(pid == 0){execvp(_argv[0], _argv);}else if(pid > 0){int st = 0;wait(&st);}}return 0; }

????????????

3.system(),popen(),fork()三個函數的qubie
????(1)system()函數
#include <stdlib.h> int system(const char *command);

???? 1)system在執行過程中經理fork -> exec -> wait ,但system在執行過程中會一直等待,直到shell命令執行完后才退出,即system為串行執行
???? 2)system在執行過程中對SIGCHLD、SIGINT、SIGQUIT都做了處理
???? 3)SIGCHLD是子進程退出的時候發給父進程的一個信號,system()中為什么要屏蔽SIGCHLD信號?就是為了system()調用能夠及時的退出并且能夠正確的獲取子進程的退出狀態(成功回收子進程)。

????(2)popen函數
#include <stdio.h> FILE *popen(const char *command, const char *type);

???? 1)popen函數在執行時無須等待shell執行完才退出,即popen是并行執行
???? 2)popen在執行時對SIGCHLD、SIGINT、SIGQUIT信號不做如何處理,
???? 3)popen創建的子進程如果不執行pclose,popen創建的子進程就會成為僵尸進程
???? 4)popen() 函數用創建管道的方式啟動一個 進程, 并調用 shell. 因為管道是被定義成單向的, 所以 type 參數只能定義成只讀或者只寫, 不能是兩者同時, 結果流也相應的是只讀或者只寫. command 參數是一個字符串指針, 指向的是一個以 null 結束符結尾的字符串, 這個字符串包含一個 shell 命令. 這個命令被送到 /bin/sh 以 -c 參數執行, 即由 shell 來執行. type 參數也是一個指向以 null 結束符結尾的字符串的指針, 這個字符串必須是 ‘r‘ 或者 ‘w’ 來指明是讀還是寫。
???? 5)popen沒有屏蔽SIGCHLD,主要的原因就是popen是”并行”的。如果我們在調用popen的時候屏蔽了SIGCHLD,那么如果在調用popen和pclose之間調用進程又創建了其它的子進程并且調用進程注冊了SIGCHLD信號處理句柄來處理子進程的回收工作(waitpid)那么這個回收工作會一直阻塞到pclose調用。這也意味著如果調用進程在pclose之前執行了一個wait()操作的話就可能獲取到popen創建的子進程的狀態,這樣在調用pclose的時候就會回收(waitpid)子進程失敗,返回-1,同時設置errno為ECHLD,標示pclose無法獲取子進程狀態。

????(3)fork函數

???? fork用來創建一個子進程.
???? 1)系統讓新的進程與舊的進程使用同一個代碼段,因為它們的程序還是相同的,對于數據段和堆棧段,系統則復制一份給新的進程,這樣,父進程的所有數據都可以留給子進程
???? 2)子進程一旦開始運行,雖然它繼承了父進程的一切數據,但實際上數據卻已經分開,相互之間不再有影響了,也就是說,它們之間不再共享任何數據了。而如果兩個進程要共享什么數據的話,就要使用另一套函數(shmget,shmat,shmdt等)來操作。現在,已經是兩個進程了,對于父進程,fork函數返回了子程序的進程號,而對于子程序,fork函數則返回零,這樣,對于程序,只要判斷fork函數的返回值,就知道自己是處于父進程還是子進程中

總結

以上是生活随笔為你收集整理的自主编写shell的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久草新免费 | jizz在线看 | 色欲av无码精品一区 | 亚洲av无码一区二区乱子仑 | 超碰97国产精品人人cao | 九热精品视频 | 欧美在线视频一区 | 精品一区二区三区免费视频 | 国产免费一区二区三区在线播放 | 欧美sm视频 | 日本国产高清 | 国产性精品 | 性工作者十日谈 | 麻豆国产91在线播放 | 性欧美巨大 | 伊人色综合久久天天 | 中文天堂在线资源 | 亚洲一区二区麻豆 | www.毛片com | 一二三精品| www.日本com | 久草成人 | 中国黄色网页 | 国模私拍一区二区三区 | 村姑电影在线播放免费观看 | 亚洲a色 | 日本aⅴ在线 | 黄色www| 一级黄色录像免费观看 | 欧美日韩中文字幕在线视频 | 日本毛片视频 | 黑人巨大精品欧美一区二区 | 校园春色 亚洲色图 | 91麻豆成人精品国产免费网站 | 国产精品又黄又爽又色无遮挡 | 亚洲一线二线在线观看 | 国产美女视频一区 | 极品探花在线 | 国产精品久久一区二区三区动 | 久久精品国产欧美亚洲人人爽 | 精品久久久一区二区 | 亚洲在线中文字幕 | 国产在线97 | 中文字幕不卡视频 | 日产精品久久久久久久蜜臀 | 亚洲品质自拍视频网站 | 97在线播放| 欧美少妇性生活 | 一本大道久久 | 涩涩涩涩av| 91亚洲精品一区 | 96精品国产 | 色综合999 | 国产一级爱| 亚洲热在线观看 | 老熟妇一区二区 | 中文字幕在线视频播放 | 鲁鲁在线| 国产亚洲精品久久久久久无几年桃 | 原创少妇半推半就88av | 久久精品中文 | 色乱码一区二区三区在线男奴 | 国产91免费视频 | av在线操| 欧美青青草 | 99精品视频一区二区三区 | www.色在线 | 日韩精品成人一区二区在线 | www.波多野结衣.com | 日韩爱爱免费视频 | 五月六月丁香 | 悠悠色在线 | 国内精品视频在线播放 | 国产又黄又大又粗视频 | 亚洲偷自 | 国产精品一线二线 | av日韩av| 九一在线观看免费高清视频 | 奇米婷婷 | 亚洲欧美一区二区三区不卡 | 色网站在线免费观看 | 亚洲在线观看av | 黄色片视频免费在线观看 | 成年人看的黄色片 | 免费观看日批视频 | 亚洲av无码专区在线播放中文 | 亚洲男人精品 | 噜噜在线视频 | 双性人hdsexvideos| 天天插插| www.69pao.com| 激情网站在线 | 奇米影视四色7777 | 日本一级吃奶淫片免费 | 天堂在线网 | 成人区人妻精品一区二区网站 | 国产91传媒| 性户外野战hd | 精品人妻一区二区三区在线视频 |