實現一個簡單的shell

來源:互聯網
上載者:User

#include <sys/types.h><br />#include <sys/wait.h><br />#include <stdio.h><br />#include <signal.h><br />#include <unistd.h><br />#define MAXARGS 20<br />#define ARGLEN 100<br />main()<br />{<br />char *arglist[MAXARGS+1];<br />int numargs;<br />char argbuf[ARGLEN];<br />char *makestring();</p><p>numargs=0;<br />while(numargs<MAXARGS)<br />{<br />printf("Arg[%d]?",numargs);<br />if(fgets(argbuf,ARGLEN,stdin)&&*argbuf!='/n')<br />{<br />arglist[numargs++]=makestring(argbuf);<br />}<br />else<br />{<br />if(numargs>0)<br /> {<br /> arglist[numargs]=NULL;<br /> execute(arglist); //zhixing<br /> numargs=0;<br /> }<br /> }<br />}<br />}</p><p> execute(char *arglist[])<br /> {<br /> int pid,exitstatus;</p><p> pid=fork(); </p><p> switch(pid)<br /> {<br /> case -1:<br /> perror("fork failed!");<br /> exit(1);<br /> case 0:<br /> execvp(arglist[0],arglist);<br /> perror("execvp failed!");<br /> exit(1);<br /> default:<br /> while(wait(&exitstatus)!=pid)<br /> ;<br /> printf("child exit with status %d,%d/n",exitstatus>>8,exitstatus&0377);</p><p> }</p><p> }</p><p> char *makestring(char *buf)<br /> {<br /> char *cp,*malloc();</p><p> buf[strlen(buf)-1]='/0';<br /> cp=malloc(strlen(buf)+1);</p><p> if(cp==NULL)<br /> {<br /> fprintf(stderr,"no memory/n");<br /> exit(1);<br /> }<br /> strcpy(cp,buf);<br /> return cp;<br /> }<br />

 

這是來自unix/linux編程實踐教程上的例子。

除了linux的系統調用,值得注意的是還有一些細節問題。

比如對於fgets()函數接受的字串的處理。

char *fgets(char *s, int size, FILE *stream);

       fgets() reads in at most one less than size characters from stream  and

       stores  them  into  the buffer pointed to by s.  Reading stops after an

       EOF or a newline.  If a newline is read, it is stored into the  buffer.

       A '/0' is stored after the last character in the buffer.

 

fgets 函數,從資料流讀取比size少1個字元,把他們儲存到s指向的緩衝區。如果遇到EOF或者換行,則

停止。如果是分行符號,分行符號也被儲存在緩衝區。'/0'被儲存在緩衝區的末尾.

所以在過程中要去掉擊鍵產生的'/n',通過makestring(char *buf)函數。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.