APUE上的例程,稍微改了下,在進程開始和結束的時候會分別顯示當前的PID和退出狀態。
不支持參數
1. fgets命令從標準輸入讀入命令,當鍵入文件結束字符(通常是Ctrl+D)時進程結束
2. 以\0替換輸入命令的最后一個字符,即去掉換行符,使得execlp能夠處理
3. fork函數創建一個新進程,對父進程返回新的子進程的非負PID,對子進程返回0
4. 在子進程中,調用execlp以執行從標準輸入讀入的命令。fork和exec的組合產生了一個新進程
5. 新的子進程開始執行后,父進程等待子進程的終止,這一要求由waitpid實現
6. 執行這個程序后還可以在這個簡易shell中創建新的自身的進程
不支持參數
1. fgets命令從標準輸入讀入命令,當鍵入文件結束字符(通常是Ctrl+D)時進程結束
2. 以\0替換輸入命令的最后一個字符,即去掉換行符,使得execlp能夠處理
3. fork函數創建一個新進程,對父進程返回新的子進程的非負PID,對子進程返回0
4. 在子進程中,調用execlp以執行從標準輸入讀入的命令。fork和exec的組合產生了一個新進程
5. 新的子進程開始執行后,父進程等待子進程的終止,這一要求由waitpid實現
6. 執行這個程序后還可以在這個簡易shell中創建新的自身的進程
#include <sys/types.h>
#include <sys/wait.h>
#include "ourhdr.h"
int main(void)
{
char buf[MAXLINE];
pid_t pid;
int status;
printf("%% ");
while (fgets(buf, MAXLINE, stdin) != NULL)
{
buf [strlen(buf) - 1] = 0;
if ( (pid = fork()) < 0)
err_sys("fork error");
else if (pid == 0)
{
execlp(buf, buf, (char *) 0);
err_ret("couldn't execute: %s", buf);
exit(127);
}
printf("*** %d ***\n", status);
/* parent */
if ( (pid = waitpid(pid, &status, 0)) < 0)
err_sys("waitpid error");
printf("*** %d ***\n", pid);
printf("%% ");
}
exit(0);
}
#include <sys/wait.h>
#include "ourhdr.h"
int main(void)
{
char buf[MAXLINE];
pid_t pid;
int status;
printf("%% ");
while (fgets(buf, MAXLINE, stdin) != NULL)
{
buf [strlen(buf) - 1] = 0;
if ( (pid = fork()) < 0)
err_sys("fork error");
else if (pid == 0)
{
execlp(buf, buf, (char *) 0);
err_ret("couldn't execute: %s", buf);
exit(127);
}
printf("*** %d ***\n", status);
/* parent */
if ( (pid = waitpid(pid, &status, 0)) < 0)
err_sys("waitpid error");
printf("*** %d ***\n", pid);
printf("%% ");
}
exit(0);
}