文章转载请注明出处,加上原文链接,谢谢!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 时,程序才执行进入 if ,调用 fork;
- 调用 fork 产生父、子进程,遇到函数 wait 父进程阻塞,执行子进程;
- 子进程调用函数 excel ,执行新程序 changedata ;
- 同上按照程序代码设计,出现提示输入数字后,同上输入数字 1 ,配置文件 config.text 中 LENG 项数值被修改。
运行结果:
疑惑
读者可以看到截图的最后是比博主预想多要输入几行的。在博主做测试时,因为起先只输入了两次数字 1 ,查看配置文件数值时发现具体项目的数值并没有被修改……但是作为初学者本人并没有深究,一度认为问题出在编写的代码上,导致接近一个下午的时间被耗费了代码中……事后万般肯定编码没有问题,本着纯粹多输入几次数字 1 的做法,随着界面跳出了 3、54、54,强制退出后查看配置文件,发现居然修改成功……那这里又是什么原因呢?如果有读者能解答,不胜感激!
参考资料
文章更新记录
- 文本开篇。 「2021.1.18 21:10」
- 文本初次完成。 「2021.1.19 20:01」
- 添加 「具体需求」 一小节。「2021.1.19 20:25」
- 修改代码。 「2021.1.21 10:57」