首先创建一个守护进程,程序中的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;
}