270分送上,有关Linux中 fork() 函数以及 exec() 系统呼出函数的问题。还请高手解答。

270分送上,有关Linux中 fork() 函数以及 exec() 系统呼出函数的问题。还请高手解答。,第1张

1,产生8个hello是正确的

-->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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8574178.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-18
下一篇 2023-04-18

发表评论

登录后才能评论

评论列表(0条)

保存