有关进程练习

1>使用父子进程完成两个文件的拷贝

父进程拷贝前一般内容,子进程拷贝后一半内容

子进程结束后退出,父进程回收子进程的资源

     1	#include <sys/wait.h>
     2	#include<myhead.h>
     3	int main(int argc, const char *argv[])
     4	{
     5		//判断文件
     6	    if (argc != 3) {
     7	        perror("file error");
     8	        return -1;
     9	    }
    10	
    11		//打开文件
    12		int fd1=-1;           
    13		if((fd1=open(argv[1],O_RDONLY))==-1)   //打开源文件
    14		{
    15			perror("open error");
    16			return -1;                      
    17		}
    18	
    19		int fd2=-1;                            //打开目标文件
    20		if((fd2=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0777))==-1)
    21		{
    22			perror("open error");
    23			return -1;
    24		}
    25	
    26	
    27	    char buf[128]="";
    28	    int res=0;
    29	    int sum = 0;
    30	
    31		//循环统计字节总数
    32		while(1)                
    33		{
    34			res=read(fd1,buf,sizeof(buf));
    35			sum+=res;
    36			if(res==0)
    37			{
    38				break;
    39			}
    40		}
    41	
    42		//定义进程号
    43		pid_t pid =fork();        //创建一个子进程
    44		if(pid==-1)
    45		{
    46			perror("fork error");
    47			return -1;
    48		}
    49	
    50	    if (pid > 0)                 //父进程
    51		{                                     
    52	                                 // 父进程拷贝前一半内容
    53	        lseek(fd1, 0, SEEK_SET); // 文件指针到开始位置
    54	        int half = sum / 2;        //文件一半
    55			int num=0;
    56	        while (num<half) 
    57			{
    58	            read(fd1, buf,1);
    59	            if (res == 0)
    60				{
    61					break;
    62				}
    63	            write(fd2, buf,1);
    64				num++;
    65	        }
    66	        
    67	    } 
    68		else
    69		{                            // 子进程
    70	                                 // 子进程拷贝后一半内容
    71			int half = 0;
    72	        lseek(fd1, half, SEEK_SET); // 移动到文件的中间位置
    73	        while (1) 
    74			{
    75	            res = read(fd1, buf, sizeof(buf));
    76	            if (res == 0)
    77				{
    78				break;
    79				}
    80	            write(fd2, buf, res);
    81	        }
    82	               exit(EXIT_SUCCESS); // 子进程完成任务后退出
    83	    }
    84	
    85		wait(NULL);
    86	
    87	    close(fd1);
    88	    close(fd2);
    89	    return 0;
    90	}

思维导图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值