进程_D1(2023-12-6)

这篇文章详细描述了一个C语言程序,通过两个子进程并发地拷贝同一文件的上下两半。主要展示了如何使用`fork()`函数和文件描述符进行I/O操作以实现高效并行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

①XMind

②双进程分工同时拷贝一个文件的上下两半部分

int main(int argc, const char *argv[])
{
    int pid = -1;


    //文件描述符创建(便于文件光标移动)
    //① 
    int rfd = -1;
    if( ( rfd = open("/root/fork2.c", O_RDONLY) ) == -1 )
    {
        perror("open error");
        printf("行号:%d \n\n", __LINE__);

        return -1;
    }
    int n = ( lseek(rfd,0,SEEK_END) - lseek(rfd,0,SEEK_SET) ) / 2;

    //② 
    int wfd = -1;
    if( ( wfd = open("/root/test.txt", O_WRONLY|O_CREAT|O_TRUNC, 0664) ) == -1 )
    {
        if( errno == EEXIST )
        {
            puts("文件已存在!");

            printf("行号:%d \n\n", __LINE__);

            wfd = open("/root/test.txt", O_WRONLY|O_TRUNC);
        }
        else
        {
            perror("open");

            printf("行号:%d \n\n", __LINE__);

            return -1;
        }
    }

    //③ 
    int rfd2;
    if( (rfd2 = open("/root/fork2.c", O_RDONLY) ) == -1 )
    {
        perror("open error");

        printf("行号:%d \n\n", __LINE__);

        return -1;
    }

    //④ 
    int wfd2 = -1;
    if( ( wfd2 = open("/root/test.txt", O_WRONLY|O_CREAT|O_TRUNC, 0664) ) == -1 )
    {
        if( errno == EEXIST )
        {
            puts("文件已存在!");

            printf("行号:%d \n\n", __LINE__);

            wfd2 = open("/root/test.txt", O_WRONLY|O_TRUNC);
        }
        else
        {
            perror("open");

            printf("行号:%d \n\n", __LINE__);
            return -1;
        }
    }


    char arr[10]="";

    pid = fork();

    if( pid>0 )
    {
        puts("父进程");
        printf("行号:%d \n\n", __LINE__);

        int pid2 = -1;

        pid2 = fork();

        if( pid2 == 0 )
        {
            puts("子进程② ");
            printf("行号:%d \n\n", __LINE__);

            lseek(rfd, 0, SEEK_SET);
            lseek(wfd, 0, SEEK_SET);

            while( n != lseek(rfd,0,SEEK_CUR) )
            {
                int m = read(rfd, arr, 1);

                write(wfd, arr, m);
            }
            puts("子进程②  结束!");
            printf("行号:%d \n\n", __LINE__);
            exit(0);
        }
    }
    else if( pid==0 )
    {
        puts("子进程① ");
        printf("行号:%d \n\n", __LINE__);

        lseek(rfd2, n, SEEK_SET);
        lseek(wfd2, 0, SEEK_END);

        while(1)
        {
            int m = read(rfd2,arr,1);

            if( m == 0 )
            {
                printf("子进程① \n");
                printf("行号:%d \n\n", __LINE__);

                break;
            }
            write(wfd2, arr, m);
        }
            puts("子进程①  结束!");
            printf("行号:%d \n\n", __LINE__);

            exit(0);
    }

    close(rfd);
    close(wfd);

    wait(NULL);
    wait(NULL);

    puts("拷贝成功!!!");

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值