C语言实现父子进程间管道通信:去除代码注释和处理单双引号
C语言实现父子进程间管道通信:去除代码注释和处理单双引号
本示例演示了如何使用C语言实现父子进程间管道通信,并对源代码进行预处理,包括去除代码注释和处理单双引号。
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
void f1(); /*让文件指针跳过注释部分*/
void f2(char c); /*对单双引号中内容的处理*/
FILE *fp;
char buf_s[1000];
int i=0; /*这几个变量在不同函数中均需出现,故定义为全局变量*/
int main()
{
pid_t pid;
int pipe_fd[2];
char buf_r[1000],c,d;
memset(buf_r,0,sizeof(buf_r)); /*初始化清空*/
if(pipe(pipe_fd)<0) /*创建管道*/
{
printf("创建管道失败");
return -1;
}
pid=fork(); /*创建子进程*/
if(pid<0) /*fork函数的返回小于0表示出错*/
{
perror("创建子进程失败");
exit(1);
}
else if (pid==0) /*返回值为0代表子进程*/
{
close(pipe_fd[1]);
read(pipe_fd[0],buf_r,1000);
printf("子进程从管道读取的文件内容是:\n%s",buf_r);
close(pipe_fd[0]);
exit(0);
}
else /*返回值大于0代表父进程*/
{
if((fp=fopen("ceshi.c","r"))==NULL) /*打开待处理的文件*/
exit(1);
while((c=fgetc(fp))!=EOF)
{
if(c=='/')
if((d=fgetc(fp))=='*')
f1(); /*出现/*则调用f1()函数*/
else
{
buf_s[i]=c;
buf_s[i+1]=d;
i+=2;
} /*普通字符直接存储*/
else if(c=='''||c=='"')
f2(c); /*调用f2()处理单、双引号间的内容*/
else
{
buf_s[i]=c;
i++;
} /*普通字符直接存储*/
}
buf_s[i]=0; /*前面已经进行过初始化,这一句可有可无*/
fclose(fp);
close(pipe_fd[0]);
write(pipe_fd[1],buf_s,strlen(buf_s)+1);
printf("父进程向管道写入完毕!\n");
close(pipe_fd[1]);
pid_t result = waitpid(pid,NULL,0);
if(result == -1){
perror("waitpid error");
exit(1);
}
exit(0);
}
}
void f1()
{
char c,d;
c=fgetc(fp);
d=fgetc(fp);
while(c!='*'||d!='/')
{ c=d;
d=fgetc(fp); }
}
void f2(char c)
{
char d;
buf_s[i]=c;
i++; /*存入一个单、双引号*/
while((d=fgetc(fp))!=c)
{
buf_s[i]=d;
i++;
if(d=='\') /*出现转义字符\'或\",\后的单、双引号应直接存储*/
{ buf_s[i]=fgetc(fp);
i++;
}
}
buf_s[i]=d; /*存入另一个单、双引号*/
i++;
}
代码解析
-
创建管道
pipe(pipe_fd)创建一个管道,pipe_fd[0]用于读取数据,pipe_fd[1]用于写入数据。
-
创建子进程
fork()创建一个子进程,子进程继承父进程的资源。
-
父进程处理数据
- 父进程打开源代码文件
ceshi.c。 - 使用
fgetc()函数读取文件内容,并根据字符类型进行处理。- 若遇到
/*,则调用f1()函数跳过注释部分。 - 若遇到
'或",则调用f2()函数处理单双引号。 - 其他字符直接存储到
buf_s中。
- 若遇到
- 处理完文件内容后,父进程将
buf_s的内容写入管道。
- 父进程打开源代码文件
-
子进程接收数据
- 子进程从管道中读取数据,并打印出来。
-
函数
f1()- 用于跳过注释部分,读取文件直到遇到
*/。
- 用于跳过注释部分,读取文件直到遇到
-
函数
f2()- 用于处理单双引号,读取文件直到遇到与第一个引号相同的字符,并将单双引号之间的内容存储到
buf_s中。 - 若遇到转义字符
\,则读取下一个字符并存储到buf_s中。
- 用于处理单双引号,读取文件直到遇到与第一个引号相同的字符,并将单双引号之间的内容存储到
总结
本示例演示了使用C语言实现父子进程间管道通信,并通过代码演示了如何去除代码注释和处理单双引号,实现对源代码的预处理。该代码可以作为学习C语言进程间通信、代码预处理的参考示例。
原文地址: https://www.cveoy.top/t/topic/orDJ 著作权归作者所有。请勿转载和采集!