源码
#include"apue.h"
#include<sys/wait.h>
int main(void)
{
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;
}
if((pid = fork()) < 0)
{
err_sys("frok error");
}
else if(pid == 0)
{
execlp(buf,buf,(char *)0);
err_ret("couldn't execute: %s',buf");
exit(127);
}
if((pid == waitpid(pid,&status,0)) < 0)
{
err_sys("waitpid error");
}
printf("%% ");
}
exit(0);
}
execlp 函数
头文件: #include<unistd.h>
原型: int execlp(const char *file , const char* arg,... (char*)0);
“该函数从 PATH 变量中所指的目录中查找符合参数 file 的文件名,找到后便执行该文件,然后依次将第二个以后的参数当作该文件的 argv[0],argv[1]..., 最后一个参数必须用空指针 NULL 做结束。”
将 fgets 输入的字符串最后一个字符替换为 null,
使用 fork 创建一个新进程,新进程是调用进程的一个副本,调用进程为父进程,新进程为子进程,
fork 创建进程时,被调用一次,但是会返回两次
对父进程返回新的子进程 ID
对子进程返回 0
子进程中,调用 execlp 执行从标准输入读入的命令,用新的程序文件替换了子进程原先执行的程序文件。
子进程调用 execlp 执行新的程序文件,而父进程希望等待子进程终止,通过调用 waitpid 来实现的,其参数指定要等待的进程 ,pid 参数是子进程的 ID, waitpid 函数返回子进程的终止状态
waitpid 函数
头文件: #include<sys/types.h> #include<sys/wait.h>
原型: pid_t waitpid(pid_t pid, int*status, int options);
pid > 0 : 只等待 进程 ID 等于 pid 子进程,不管其他多少子进程退出,只要指定的子进程还没结束,就一直等待下去
pid = -1 : 等待任何一个子进程退出,没有任何限制
pid = 0 : 等待同一个进程组的任何子进程,如果子进程已经加入了别的进程组,waitpid 不会对它做任何理睬
pid < -1 : 等待一个指定进程组的任何子进程,这个进程组的 ID 等于 pid 的绝对值
status : 如果非空,则终止进程的终止状态就存放在 status 所指向的单元,如果是一个空指针,则表示父进程不关心子进程的终止状态。
其他参数还不太清楚,有知道的大佬可以指点一下,谢谢。