文件编程练手 [3] —— 使用 fork 与 execl 实现配置文件的修改(练手 [2] 的延伸)

文章转载请注明出处,加上原文链接,谢谢!https://blog.csdn.net/weixin_46959681/article/details/112794946



碎碎念

笔者一路反复听陈立臣老师讲述关于 exec 函数族的课足足两个来小时多(原谅我是个菜鸟),个人默默无语中……原来该函数家族里的成员基本是各自包了一层皮,看似改头换面是一个新的函数,但实际上是换汤不换药……

关于 exec 族函数中各个函数成员的具体用法请参考下面这篇博客,笔者重点放在以 fork、exec 函数实现练手项目 [2]

linux进程—exec族函数(execl, execlp, execle, execv, execvp, execvpe)


使用 fork、execl 实现配置文件的修改

|具体需求

当父进程检测到输入的数字为 1 时,创建子进程执行函数 execl 调用文件 changedata 把配置文件的字段修改掉,即将配置文件 config.text 中的长度数值 LENG=9 修改成 LENG=5 。

/* 文件 config.text */
SPEED=5
LENG=9
SCORE=60
LEVEL=20	

|编译文件changedata.c 生成可执行文件 changedata

演示代码: changedata.c

/* 编译文件 changedata.c 生成可执行文件 changedata 。*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>

int main(){
    
    

        pid_t pid;

        while(1)
        {
    
    
                int data;
                printf("Please enter a data in changeConfig.c\n");
                scanf("%d\n",&data);
                //唯有在 data=1 时,才执行下面的步骤。
                if(data == 1)
                {
    
    
                        pid = fork();

						if(pid == 0)
                        {
    
    
                                int fdSrc;
                                char *readBuf = NULL;
                                
                                fdSrc = open("./config.text",O_RDWR);

                                printf("%d\n",fdSrc);
                                int size = lseek(fdSrc,0,SEEK_END);
                                printf("%d\n",size);
                                lseek(fdSrc,0,SEEK_SET);

                                readBuf = (char *)malloc(sizeof(char)*size + 20);
                                read(fdSrc,readBuf,size);
                                printf("%d\n",size);

                                char *p = strstr(readBuf,"LENG=");
                                if(p == NULL){
    
    
                                        printf("No data your search.\n");
                                        exit(-1);
                                }

                                p = p + strlen("LENG=");
                                //单引号表示的内容是字符。
                                *p ='5';
                                lseek(fdSrc,0,SEEK_SET);

                                write(fdSrc,readBuf,strlen(readBuf));
                                close(fdSrc);
                        }
                }
                else{
    
    
                        printf("Nothing in changeConfig.c.\n");
                }
        }
        return 0;
}

|配合生成的执行文件 changedata ,执行 forkAndexecl.c

/* 文件forkAndexecl.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>

int main()
{
    
    
        pid_t pid;
        int data = 20;
        while(1){
    
    
                printf("Enter a number:\n");
                scanf("%d",&data);

                //只有在 data=1 以下步骤才执行。
                if(data == 1){
    
    
                        int fdSrc;
                        pid = fork();
                                                
                        if(pid > 0){
    
    
                                //阻塞父进程。
                                wait(NULL);             
                        }
                        if(pid == 0){
    
    
                                execl("./changedata","changedata","config.text",NULL);
                                //在实际调试代码时打印信息刷屏,之后为强制退出而使用exit(-1)。 
                                exit(-1); 
						}
                }
                else{
    
    
                        printf("Nothing in forkAndconfig.c\n");
                }
        }
        return 0;
}

| 代码逻辑

  1. 提示用户输入数字;
  2. 当且仅当用户输入数字 1 时,程序才执行进入 if ,调用 fork;
  3. 调用 fork 产生父、子进程,遇到函数 wait 父进程阻塞,执行子进程;
  4. 子进程调用函数 excel ,执行新程序 changedata ;
  5. 同上按照程序代码设计,出现提示输入数字后,同上输入数字 1 ,配置文件 config.text 中 LENG 项数值被修改。

运行结果:

在这里插入图片描述


疑惑

读者可以看到截图的最后是比博主预想多要输入几行的。在博主做测试时,因为起先只输入了两次数字 1 ,查看配置文件数值时发现具体项目的数值并没有被修改……但是作为初学者本人并没有深究,一度认为问题出在编写的代码上,导致接近一个下午的时间被耗费了代码中……事后万般肯定编码没有问题,本着纯粹多输入几次数字 1 的做法,随着界面跳出了 3、54、54,强制退出后查看配置文件,发现居然修改成功……那这里又是什么原因呢?如果有读者能解答,不胜感激!

扫描二维码关注公众号,回复: 13126902 查看本文章

参考资料


文章更新记录

  • 文本开篇。 「2021.1.18 21:10」
  • 文本初次完成。 「2021.1.19 20:01」
  • 添加 「具体需求」 一小节。「2021.1.19 20:25」
  • 修改代码。 「2021.1.21 10:57」

猜你喜欢

转载自blog.csdn.net/weixin_46959681/article/details/112794946