-->fork--->fork----->printf---->printf---->exit
1------>1------->1----------------------------->
||->1----------------------------->
|->1------->1----------------------------->
|->1----------------------------->
主进程产生2个子进程,第一个子进程产生1个新子进程,加在一起4个进程,其中子进程3个,父进程2个(其中一个进程既是子进程又是父进程)。
2,执行结果可能并不固定,但是它会把1234各打印一次,0打印3次,且4必在3后打印
主-->fork1------>fork3---->pr(2)----->pr(0)---->return
|=0 |=0
| -->子2--->pr(1)----->exit(0)
-->子1---->fork2---->wait--------------------------------->pr(4)--->pr(0)---->return
|=0
-->子1_1--->pr(3)---->pr(0)---->return
3,A不打印***ps is done
B打印***ps is done
原因是使用execlp不会产生子进程,execlp(execvp,..)函数一旦实行参数的命令和指定参数就将执行,但是执行后,相应程序将终止。
system则产生子进程去执行参数命令,主进程阻塞直到子进程结束,然后主进程继续执行。
system原型中有一段
if(pid = 0){
execl("/bin/sh", "sh", "-c", cmdstring, (char *)0)
-exit(127)//子进程正常执行则不会执行此语句
}
else{
while(waitpid(pid, &status, 0) <0){
if(errno != EINTER){
status = -1
break
}
}
建议你多看看多进程方面的资料,理解多进程的工作方式
不知道你这实现这些函数的调用是什么意思,是要重写这些接口吗?还是举个例子说明?我解释一下吧:
(1)system()其实就是对fork()和exec()函数族等的封装。
(2)fork()是用来产生子进程的,是现在我知道的唯一一个返回两个值的函数(有过有另外的,麻烦网友指出),返回-1表示执行失败;否则返回大于0的值时,表示是子进程的进程号,返回0时,表示父进程创建子进程成功。
(3)exec()不是一个函数,是函数族,有execl(),execv(),execle(),execve(),execlp(),execvp(),它们常用于子进程中“脱胎换骨”,就是父进程创建子进程后,子进程几乎是父进程的拷贝(只有很少的东西不一样,如进程号(PID)等),然后子进程调用exec()函数族执行其他的程序,即将原来进程的东西全部清除掉,称为一个崭新的进程,所以叫“脱胎换骨”。
(4)waitpid()是用在父进程中等待进程退出的,如果父进程不调用这个接口,那么它有可能先于子进程退出,那么子进程就会称为孤儿进程,继而被init进程(PID为1的进程,Linux启动后第一个启动的进程)收养。或者父进程并未退出,也未调用这个接口,但是子进程已经执行完成,那么子进程就会成为一个僵尸进程。
具体例子在网上找找吧,都不是很难。
#include <stdio.h>#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
int pipe_fds[2]
int pid
if(pipe(pipe_fds))
{
fprintf(stderr,"pipe error!\n")
return -1
}
if((pid = fork())<0)
{
fprintf(stderr, "fork error!\n")
return -1
}
if(pid == 0)
{
char buf[20] = {0}
int n,i
close(pipe_fds[1])
read(pipe_fds[0],buf,sizeof(buf))
n=atoi(buf)
for(i=1i<=ni++)
{
if(i%10 == 0)
printf("\n")
printf("%d\t",i)
}
close(pipe_fds[0])
}
else
{
int m
char bf[20] = {0}
close(pipe_fds[0])
printf("the child pid:%d\n",pid)
printf("please input number:")
scanf("%d",&m)
printf("\n")
sprintf(bf,"%d",m)
write(pipe_fds[1],bf,sizeof(bf))
wait(NULL)
printf("child complete!\n")
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)