通过创建守护进程实时拷贝指定文件

首先创建一个守护进程,程序中的chdir中的路径需要修改成自己电脑的指定路径,因为不同人的电脑,用户名是不同的,不修改的话可能会报错,程序会在这个路径下创建一个copy.txt的文件,在运行时需要在输入./a.out 后面加上一个源文件,如果不添加会提示错误,参数不对,源文件没有会自动创建,在源文件中输入,会自动实时拷贝到copy.txt文件中。在运行结束后一定要删除掉这个守护进程,不然它会一直在电脑中运行。使用pidof a.out查找到这个程序,然后kill -2加上刚才找到的进程号就可以了。

#include <head.h>

int main(int argc,const char * argv[])
{
    pid_t pid;
    int dfd,sfd;
    pid=fork();
    if(pid==-1){
        PRINT_ERR("pid error");
    }else if(pid==0){
        if(setsid()==-1)
            PRINT_ERR("setsid error");
        if(chdir("/home/linux/IO/W6d6/"))
            PRINT_ERR("chdir error");
        umask(0);
        if(argc!=2){
            printf("input error\n");
            printf("usage:./a.out filename\n");
            return -1;
        }
        for(int i=3;i<getdtablesize();i++){
            close(i);
        }
        if((dfd=open("copy.txt",O_RDWR|O_CREAT|O_TRUNC,0666))==-1)
            PRINT_ERR("open file error");
        if((sfd=open(argv[1],O_RDONLY|O_CREAT,0666))==-1)
            PRINT_ERR("open file error");
        dup2(dfd,0);
        dup2(dfd,1);
        dup2(dfd,2);
        long len=0;
        long len_temp=0;
        int read_len;
        char buf[128]={0};
        while(1){
            len_temp=lseek(sfd,0,SEEK_END);
            while(len<len_temp){
                lseek(sfd,len,SEEK_SET);
                read_len=read(sfd,buf,sizeof(buf));
                write(dfd,buf,read_len);
                len+=read_len;
            }
            if(len>len_temp){
                len=0;
                close(dfd);
                dfd=open("copy.txt",O_RDWR|O_CREAT|O_TRUNC,0666);
            }
            close(sfd);
            sfd=open(argv[1],O_RDONLY);
            }
            
        
    }else{
        exit(EXIT_SUCCESS);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值