LinuxC學習之myshell的實現

2021-06-22 22:30:12 字數 2893 閱讀 6419

通過兩天時間的努力,自己做的myshell終於成功了,現在分享一下自己做的時候出現的問題以及需要的地方。剛開始做的時候,自己框架不知道怎麼搭,而且有很多細節想不通,就遲遲沒有開寫。整整過了乙個早上之後,還是想不通,沒辦法了,就自己開始寫吧,不能浪費時間不是,就乙個乙個函式寫吧。這個決定讓我自己最後有了一次大改的動作。

在這裡先介紹一下我的思路:

先將命令儲存起來。

將命令解析出來,放到二維陣列當中。

根據命令的不同,比如(cd,>),給出乙個標記的值。

vfork乙個程序,因為這樣,呼叫系統命令時候才能不將父程序關閉。

根據不同的標記值,進入不同的函式。

迴圈。

下面貼出我的**:

#include #include #include #include #include #include #include #include #include #include void find_command(char ** argv1)

while((ptr = readdir(dir)) != null )

}printf("\nok\n");

}int chose(int count,char ** argv1)

for( i = 0 ; i < count ; i++ )

return flag;

}void change_dir(char ** argv1)

getcwd(buf,100);

printf("%s\n",buf);

}void outputdir(int count,char ** argv1)

*/ for( i = 0 , j = 0; i < count ; i++)

argv[j] = argv1[i];

j++;

}argv[j] = null;

if((fd = open(argv1[num],o_excl | o_trunc | o_creat | o_rdwr , 0666)) < 0 )

// pid = vfork();

// if( pid == 0 )

exit(0);

// }

}int main()

argv[i][j] = shell_order[k];

}argv[i][j] = '\0';

count++;

// printf("%d\n\n",count);

for( i = 0 ; i < count ; i++ )

argv1[i] = null;

printf("%d\n",count);

flag = chose(count,argv1);

printf("%d\t\n\n\n",flag);

pid = vfork();

if(pid ==0 )

exit(0);

}// find_command(argv1);

wait(null);

}return exit_success;

}

這個只是簡單的shell,因為管道,後台的機制還不了解,這些功能後續接著加上。

現在說說我寫的時候出現的問題。

使用execvp函式時候,第二個引數的問題我以為只是把將要執行的程式名字敲上去就好了,就直接寫的argv[0],結果不停報錯,我當時很納悶。最後查到了這個第二個引數必須是以null,結尾的字元指標的陣列。最後不得不加一步,讓二維陣列的位址儲存到指標陣列中。

寫輸出重定向時候,老是提示找不到目錄(因為我設定在/usr/bin中查詢)。進入到該目錄下,發現確實沒有「>」,但我的指標陣列裡有指向「>」的指標,沒辦法,只好接著寫個指標陣列將「>」以及「>」這個之後的檔名的指標都遮蔽掉。這才可以執行了。

剛寫完時候,我用cd命令想測一下,看是否可以切換目錄,結果發現是不可以的,我就去/usr/bin目錄下查詢,可是這次卻發現,該目錄下卻是有這個程式的,我猜想是/usr/bin是不能呼叫的,我就想著改個名字試一下,可改之後,在終端下還是可以用的。因此原因不在這裡。我現在想著可能子程序切換目錄了,但因為時間太短,就又回到原目錄下了,我加上sleep函式來延長時間。可是發現也沒用,程式的結果是根本就沒有執行這個函式,直接退出了。現在想一下確實是這樣,因為通過exec函式族開啟新的程序之後,原程序直接結束了,所以沒有執行sleep函式。那到底是什麼問題呢?通過查書,發現父程序vfork的程序,跟父程序是共用的資料段,因此,父程序的環境變數,子程序是沒法改變得,所以,cd是呼叫不了的。後面我就自己寫了個cd的函式呼叫。

在最後排版時候發現,怎麼也排版不了,因為我用的是vfork,所以當時完全對父子程序的順序不擔心,可是怎麼除錯,結果都跟fork的結果一樣,先是父程序進入到了下一層迴圈,列印出了shell名字,然後是子程序執行的各種結果。除錯好久,都沒有得到想要的結果,是在沒辦法,用wait函式將父程序掛起來,等子程序結束。這一下成功了,翻書檢視定義,發現vfork呼叫exec或exit之後,父程序可能被排程執行。錯出在這裡。

通過myshell的實現,才發現有這麼多的問題需要注意,慶幸組長最後讓我寫這個程式了(原來沒要求必須寫),通過自己去思考,自己實現,發現其中有很多的歡樂。哈哈

linux c學習之執行緒控制

這一周前兩天把執行緒控制看完了,在這裡總結一下我的易錯點以及需要注意的點。1 程序跟執行緒的關係 在我看來單一程序就是乙個大的執行緒,但是如果程序中建立了多個執行緒之後,它就成了父執行緒,如果父執行緒結束,那麼子執行緒也就結束了。這點跟子程序不同。2 多個子執行緒是共用程序的儲存空間,不像子程序一樣...

Linux C 學習之路

linux系統基礎 常用unix linux命令 熟悉檔案管理 文字處理 程序管理 網路 系統管理等各個方面大約100個常用的命令。深入了解bash 了解linux預設shell bash 的語法 命令執行 i o重定向 任務控制等。正規表示式基礎 由於unix linux中很多強大的文字處理命令如...

Linux C 學習之路

module01 linux系統基礎 由於本系列課程基於linux 或unix 熟悉linux作業系統是必要的前提。該模組的課程包含以下方面的內容 常用unix linux命令 熟悉檔案管理 文字處理 程序管理 網路 系統管理等各個方面大約100個常用的命令。深入了解bash 了解linux預設sh...