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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

笔记1-3: 从标准输入读取命令并执行

發布時間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 笔记1-3: 从标准输入读取命令并执行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從標準輸入讀取命令并執行:

?

#include <apue.h>

#include <unistd.h>

#include <sys/wait.h>

?

int main(int argc, char ** argv)

{

???char??buf[MAXLINE];

???pid_t?pid;

???int???status;

???printf("%% ");

???while (fgets(buf, MAXLINE, stdin) != NULL)

???{

??????if (buf[strlen(buf) - 1] == '\n')

??????????buf[strlen(buf) - 1] = 0;??????// replace newline with NULL

??????if ((pid = fork()) < 0) {

??????????err_sys("fork error\n");

??????} else if (pid == 0) {????????????// child, 子進程從這里執行

??????????execlp(buf, buf, (char*)0);

??????????err_ret("could not execute : %s\n", buf);

??????????exit(127);

??????}

??????// parent, 父進程從這里執行

??????if ((pid = waitpid(pid, &status, 0)) < 0)

??????????err_sys("waitpid error.\n");

??????printf("%% ");

???}

???return 0;

}

?

因為上面的gfets函數讀入命令到buf時,緩沖區最后一個字符為’\n’,所以讀入后,要把’\n’置換為NULL。

Unix通過fork函數創建一個新的進程,函數原型為:

pid_t?fork?(void);

pid_t為一個整數類型。

fork()的調用,會創建一個新的Unix進程,新進程是原進程的一個復制品,我們稱呼原來的進程為父進程,新創建的進程為子進程。fork()調用一次,會得到兩次返回。對于父進程,fork()會返回新的子進程的進程ID(非負數);對于子進程,fork()會返回0(分別在父子進程返回)。

fork()函數調用,會將父進程的地址空間完整地復制給子進程,調用后,父子進程各自擁有自己獨立的進程空間。后續程序可根據pid_t的返回值,來確定父子進程的程序不同走向。

fork()返回負數,表示創建進程失敗。

?

exec系列函數用于執行一個新的可執行文件。通常是在fork()后的子進程中調用,其作用是,把新的可執行文件加載到內存,來覆蓋本進程的原有的進程空間,并跳到新可執行文件的起始位置重新執行。execlp()函數是exec()系列函數組中的一個。

?

父進程希望等待子進程終止,可以調用waitpid()函數實現。原型為:

pid_t waitpid(pid_t pid,int * status,int options);

pid指出子進程的IDwaitpid可以返回子進程的終止狀態(status)。

?

?

?

?

轉載于:https://www.cnblogs.com/gradliang/archive/2013/05/22/3788972.html

總結

以上是生活随笔為你收集整理的笔记1-3: 从标准输入读取命令并执行的全部內容,希望文章能夠幫你解決所遇到的問題。

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