操作系統(tǒng)實(shí)驗(yàn)二歸納

本實(shí)驗(yàn)是要求在linux環(huán)境下測(cè)試fork()和exec()嗦玖,并建立一個(gè)簡(jiǎn)單的shell(帶cd宇挫、env翠储、echo援所、help、jobs滔岳、quit命令)

  • fork()

這一節(jié)沒(méi)啥難度,主要是測(cè)試當(dāng)前l(fā)inux環(huán)境下gcc是否能編譯成功

清單 2-1 創(chuàng)建進(jìn)程
#include <stdio.h>   //此處指導(dǎo)書上沒(méi)有
int main (){
    int x;
    while((x=fork())==-1);
    if (x==0)
        printf("a");
    else
        printf("b");
printf("c");
}

這里出現(xiàn)了很奇妙的問(wèn)題,指導(dǎo)書上沒(méi)有使用stdio頭文件奏赘,不過(guò)顯然這樣編譯不會(huì)通過(guò)。但是加上了以后又出現(xiàn)了一個(gè)坑梁只,實(shí)驗(yàn)室里的linux沒(méi)有安裝gcc的包依賴。此處需要我們重裝個(gè)gcc

$ sudo apt-get install build-essential  //此處也許會(huì)失敗构舟,提示缺少幾個(gè)依賴,那就安裝相應(yīng)的包
$ sudo apt-get install g++   //上一步如果不行就運(yùn)行這個(gè)再運(yùn)行上一條

linux下怎么build .c文件也留檔一下吧
$ gcc -o hello hello.c // 第一個(gè)為生成的文件名努咐,第二個(gè)為.c文件

  • exec()

這真是一個(gè)騷操作∫粑澹可以直接用新的進(jìn)程映象置換當(dāng)前的進(jìn)程映象躺涝,留檔函數(shù)原型

exec 系列有 6 個(gè)函數(shù)坚嗜,原型如下:
extern char **environ;
int execl( const char *path, const char *arg, ...);
int execlp( const char *file, const char *arg, ...);
int execle( const char *path, const char *arg , ..., char * const envp[]);
int execv( const char *path, char *const argv[]);
int execve (const char *filename, char *const argv [], char *const envp[]);
int execvp( const char *file, char *const argv[]);
exec 系列函數(shù)用新的進(jìn)程映象置換當(dāng)前的進(jìn)程映象.這些函數(shù)的第一個(gè)參數(shù)是待執(zhí)行程序的路
徑名(文件名)。這些函數(shù)調(diào)用成功后不會(huì)返回,其進(jìn)程的正文(text),數(shù)據(jù)(data)和棧(stack)段被待執(zhí)行
程序程序覆蓋碟绑。但是進(jìn)程的 PID 和所有打開(kāi)的文件描述符沒(méi)有改變,同時(shí)懸掛信號(hào)被清除,信號(hào)重
置為缺省行為凯肋。
在函數(shù) execl,execlp,和 execle 中, const char *arg 以及省略號(hào)代表的參數(shù)可被視為 arg0,
arg1, ...,argn。它們合起來(lái)描述了指向 NULL 結(jié)尾的字符串的指針列表苗桂,即執(zhí)行程序的參數(shù)列表煤伟。作
為約定,第一個(gè) arg 參數(shù)應(yīng)該指向執(zhí)行程序名自身,參數(shù)列表必須用 NULL 指針結(jié)束。
execv 和 execvp 函數(shù)提供指向 NULL 結(jié)尾的字符串的指針數(shù)組作為新程序的參數(shù)列表放案。作為約
定掸冤,指針數(shù)組中第一個(gè)元素應(yīng)該指向執(zhí)行程序名自身憨攒。指針數(shù)組必須用 NULL 指針結(jié)束。
execle 函數(shù)同時(shí)說(shuō)明了執(zhí)行進(jìn)程的環(huán)境(environment),它在 NULL 指針后面要求一個(gè)附加參
數(shù),NULL 指針用于結(jié)束參數(shù)列表,或者說(shuō),argv 數(shù)組妹蔽。這個(gè)附加參數(shù)是指向 NULL 結(jié)尾的字符串的指
針數(shù)組,它必須用 NULL 指針結(jié)束。其它函數(shù)從當(dāng)前進(jìn)程的 environ 外部變量中獲取新進(jìn)程的環(huán)境元镀。
execlp和execvp可根據(jù)path搜索合適的程序運(yùn)行,其它則需要給出程序全路徑萎坷。
execve()類似 execv()凹联,但是加上了環(huán)境的處理沐兰。

在把此處的示例程序解釋一下吧:

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main(){
        pid_t pid;
        /* fork a child process */
        pid = fork();
        if (pid < 0){
        /* error occurred */
                fprintf(stderr, "Fork Failed");
                return 1;
        }
        else if (pid == 0){ 
        /* 子進(jìn)程 */
        execlp("/bin/ls","ls",NULL);
        }
        else { /* 父進(jìn)程 */
        / * 父進(jìn)程將一直等待哆档,直到子進(jìn)程運(yùn)行完畢*/
        wait(NULL);
        printf("Child Complete");
        }
return 0;
}

我的理解是這份代碼的意思應(yīng)該是,創(chuàng)建一個(gè)進(jìn)程住闯,如果該進(jìn)程的pid<0(當(dāng)然創(chuàng)建fork成功會(huì)返回大于0的數(shù))提示fork失敗瓜浸。然后再使用execlp調(diào)用系統(tǒng)中的ls命令,運(yùn)行結(jié)果圖

EwdAger
  • 簡(jiǎn)單的shell

#include <sys/types.h>
#include <sys/wait.h>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

char op[256];
char arg[256];
char str[1024];

int main()
{
    pid_t CurSon;

    while(1){
        scanf("%s", op);
        if(strcmp(op, "quit") == 0 || strcmp(op, "exit") == 0 || strcmp(op, "bye") == 0){
            printf("\nQuiting...Bye~");
            return 0;
        }else if(strcmp(op, "help") == 0){
            printf("It's a fake shell~\n");
        }else if(strcmp(op, "cd") == 0){
            scanf("%s", arg);
            sprintf(str, "cd %s", arg);
            system(str);
        }else if(strcmp(op, "environ") == 0){
            system("env");
        }else if(strcmp(op, "echo") == 0){
            scanf("%s", arg);
            sprintf(str, "echo %s", arg);
            system(str);
        }else if(strcmp(op, "jobs") == 0){
            system("ps");
        }else{
            fgets(arg, 256, stdin);
            sprintf(str, "%s %s", op, arg);
            while((CurSon = fork()) < 0);
            if(CurSon == 0){
                system(str);
                return 0;
            }else{
                wait(NULL);
                printf("%s\n", str);
                printf("Complete...\n");
            }
        }
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末比原,一起剝皮案震驚了整個(gè)濱河市插佛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌量窘,老刑警劉巖雇寇,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蚌铜,居然都是意外死亡锨侯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門冬殃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)囚痴,“玉大人,你說(shuō)我怎么就攤上這事审葬∩罟觯” “怎么了奕谭?”我有些...
    開(kāi)封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)痴荐。 經(jīng)常有香客問(wèn)我血柳,道長(zhǎng),這世上最難降的妖魔是什么蹬昌? 我笑而不...
    開(kāi)封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任混驰,我火速辦了婚禮,結(jié)果婚禮上皂贩,老公的妹妹穿的比我還像新娘栖榨。我一直安慰自己,他們只是感情好明刷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布婴栽。 她就那樣靜靜地躺著,像睡著了一般辈末。 火紅的嫁衣襯著肌膚如雪愚争。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天挤聘,我揣著相機(jī)與錄音轰枝,去河邊找鬼。 笑死组去,一個(gè)胖子當(dāng)著我的面吹牛鞍陨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播从隆,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诚撵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了键闺?” 一聲冷哼從身側(cè)響起寿烟,我...
    開(kāi)封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辛燥,沒(méi)想到半個(gè)月后筛武,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挎塌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年徘六,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勃蜘。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡硕噩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缭贡,到底是詐尸還是另有隱情炉擅,我是刑警寧澤辉懒,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站谍失,受9級(jí)特大地震影響眶俩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜快鱼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一颠印、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抹竹,春花似錦线罕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至袄琳,卻和暖如春询件,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唆樊。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工宛琅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逗旁。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓嘿辟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親痢艺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仓洼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容