首先回顾之前所讲,在说明“为什么要创建进程”的时候,提到过以下两个原因:
其中第一个原因很好理解,而第二个原因就包含了上节所讲的exec族函数的知识点,并且不管是之前的博文还是上节的exec,都提到了一点“exec族函数通常会和fork一起使用,从而实现在原程序运行时,创建一个新进程来执行不同的程序的效果”
所以本节来演示如何将fork函数和exec族函数结合起来使用:
实现需求:
当父进程检测到输入为1时,创建子进程把配置文件的字段值修改掉
实现思路:
修改配置文件的代码之前就写过:模拟 修改配置文件_mjmmm的博客-CSDN博客
代码位于FILE文件夹下的demo6.c
所以,我的思路是:先将demo6.c再编译生成一个可执行文件;
然后使用execl函数来将“修改参数的可执行文件”替换原来fork后的子进程
demo4.c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>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 ”:
此时再打开config文件:
配置文件修改成功!
同时,如果此时查看相关进程:“ps -aux|grep out1”
会发现PID为4112的子进程已经成功退出,没有变成僵尸进程!