笔记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指出子進程的ID,waitpid可以返回子進程的終止狀態(status)。
?
?
?
?
轉載于:https://www.cnblogs.com/gradliang/archive/2013/05/22/3788972.html
總結
以上是生活随笔為你收集整理的笔记1-3: 从标准输入读取命令并执行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WindowsPhone8游戏开发字体国
- 下一篇: 选房心得