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++;
}

代码解析

  1. 创建管道

    • pipe(pipe_fd) 创建一个管道,pipe_fd[0] 用于读取数据,pipe_fd[1] 用于写入数据。
  2. 创建子进程

    • fork() 创建一个子进程,子进程继承父进程的资源。
  3. 父进程处理数据

    • 父进程打开源代码文件 ceshi.c
    • 使用 fgetc() 函数读取文件内容,并根据字符类型进行处理。
      • 若遇到 /*,则调用 f1() 函数跳过注释部分。
      • 若遇到 '",则调用 f2() 函数处理单双引号。
      • 其他字符直接存储到 buf_s 中。
    • 处理完文件内容后,父进程将 buf_s 的内容写入管道。
  4. 子进程接收数据

    • 子进程从管道中读取数据,并打印出来。
  5. 函数 f1()

    • 用于跳过注释部分,读取文件直到遇到 */
  6. 函数 f2()

    • 用于处理单双引号,读取文件直到遇到与第一个引号相同的字符,并将单双引号之间的内容存储到 buf_s 中。
    • 若遇到转义字符 \,则读取下一个字符并存储到 buf_s 中。

总结

本示例演示了使用C语言实现父子进程间管道通信,并通过代码演示了如何去除代码注释和处理单双引号,实现对源代码的预处理。该代码可以作为学习C语言进程间通信、代码预处理的参考示例。

C语言实现父子进程间管道通信:去除代码注释和处理单双引号

原文地址: https://www.cveoy.top/t/topic/orDJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录