当前位置: 技术问答>linux和unix
关于子进程的所谓调用excelp以执行另一个程序,有点不理解。
来源: 互联网 发布时间:2015-10-29
本文导语: 不是说子进程调用excelp后,子进程的代码段变成了excelp所指向的代码了吗?然后子进程excelp所指向的代码的开始处开始执行 以下是在linux上一小段通过编译的代码: #include #include #include #include #include ...
不是说子进程调用excelp后,子进程的代码段变成了excelp所指向的代码了吗?然后子进程excelp所指向的代码的开始处开始执行
以下是在linux上一小段通过编译的代码:
#include
#include
#include
#include
#include
#include
#define MAX_LINE 80
int main()
{
int status;
pid_t childpid;
char cmd[MAX_LINE+1];
char * sret;
while (1)
{
printf("mysh>");
sret=fgets(cmd,sizeof(cmd),stdin);
if(sret==NULL) exit(-1);
cmd[strlen(cmd)-1]=0;
if(!strncmp(cmd,"bye",3))
exit(0);
childpid=fork();
if(childpid==0)
{
execlp(cmd,cmd,NULL);
}
else if (childpid>0)
{
waitpid(childpid,&status,0);
}
printf("n");
}
return 0;
}
比如编译后能执行的文件为simpleshell
则执行simpleshell后(输入./simpleshell)
$./simpleshell
mysh>date
Sun Nov 13 19:27:25 EST 2005
mysh>ls
arg arg.c hello.c simple simple.c
...
mysh>bye
$
我一直以为excelp调用后,子进程的代码就是excelp中所指向的代码了,比如,输入date后,那么子进程的代码就是/bin/date这个程序的代码,执行完date,子进程就结束了.但这里似乎子进程的代码段仍然包括while(1)整个循环,有点不理解.
可能我理解错了,请高手指点
|
exec部分就如你所理解的那样。
你理解错的部分是:但这里似乎子进程的代码段仍然包括while(1)整个循环。
waitpid(childpid,&status,0); //这是父进程的代码。
fork之后,父进程waitpid来等待子进程的结果,以你输入ls来说,子进程成了ls程序的进程,而父进程执行waitpid进入睡眠以等待子进程结束,然后子进程打印完当前目录的文件后,就退出结束了,此时父进程从waitpid返回,继续进行while循环,从标准输入取得命令,然后继续上面的步骤。
你理解错的部分是:但这里似乎子进程的代码段仍然包括while(1)整个循环。
waitpid(childpid,&status,0); //这是父进程的代码。
fork之后,父进程waitpid来等待子进程的结果,以你输入ls来说,子进程成了ls程序的进程,而父进程执行waitpid进入睡眠以等待子进程结束,然后子进程打印完当前目录的文件后,就退出结束了,此时父进程从waitpid返回,继续进行while循环,从标准输入取得命令,然后继续上面的步骤。