fork函数和exec族函数的结合使用 的案例

  首先回顾之前所讲,在说明“为什么要创建进程”的时候,提到过以下两个原因:

fork函数和exec族函数的结合使用 的案例_第1张图片

其中第一个原因很好理解,而第二个原因就包含了上节所讲的exec族函数的知识点,并且不管是之前的博文还是上节的exec,都提到了一点“exec族函数通常会和fork一起使用,从而实现在原程序运行时,创建一个新进程来执行不同的程序的效果

所以本节来演示如何将fork函数和exec族函数结合起来使用

实现需求:

当父进程检测到输入为1时,创建子进程把配置文件的字段值修改掉

实现思路:

修改配置文件的代码之前就写过:模拟 修改配置文件_mjmmm的博客-CSDN博客

代码位于FILE文件夹下的demo6.c

所以,我的思路是:先将demo6.c再编译生成一个可执行文件;

然后使用execl函数来将“修改参数的可执行文件”替换原来fork后的子进程

demo4.c:

#include 
#include 
#include 
#include 
#include 


int main(void)
{
	pid_t pid;
	pid_t fork_return;
	int cmd = 0;
	
	printf("please input a cmd number\n");
	scanf("%d",&cmd);
    if(cmd == 1){
	    fork_return = fork();
	    if(fork_return > 0){
			wait(NULL); //不要忘记!
        }else{
            printf("This is the son JC,PID = %d\n",getpid());
                	        
            if(execl("/home/mjm/FILE/modify","modify","/home/mjm/FILE/test.config",NULL) == -1){
                        	printf("execl failed!\n");
                        	perror("why");
            }
        }
	}

   	return 0;
}

再次强调,fork之后的父进程一定要记得等待子进程退出!

并且,我们已经知道在execl成功调用后,程序会被完全替代成新的,而新的程序,也就是modify对应的C程序中,最后包含了return0,当执行到return0的时候,就视为子进程正常退出了。

效果演示:

先将修改参数的文件编译成可执行文件:

然后再运行代码,并输入“1 ”:

fork函数和exec族函数的结合使用 的案例_第2张图片

 此时再打开config文件:
fork函数和exec族函数的结合使用 的案例_第3张图片

配置文件修改成功! 

同时,如果此时查看相关进程:“ps -aux|grep out1

会发现PID为4112的子进程已经成功退出,没有变成僵尸进程! 

 

你可能感兴趣的:(linux,运维,服务器,系统编程)