守护进程-线程

 

 

 

 

 

 

 

 

 

 

 

 

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <time.h>
#define _FILE_NAME_FORMAT_ "%s/log/mydaemon.%ld"

void touchfile(int num){
    char* HomeDir=getenv("HOME");
    char filename[256]={0};
    sprintf(filename,_FILE_NAME_FORMAT_,HomeDir,time(NULL));
    int fd=open(filename,O_RDWR|O_CREAT,0666);

    if(fd<0){
        perror("open error!");
        exit(1);
    }
    close(fd);
}

int main()
{

    //创建子进程,父进程退出
    pid_t pid=fork();
    if(pid>0){
        exit(1);
    }
    //当会长
    setsid();
    //设置掩码
    umask(0);
    //切换目录
    chdir(getenv("HOME")); //
    //关闭文件描述符
    //执行核心逻辑
    struct itimerval myit={{60,0},{1,0}};
    setitimer(ITIMER_REAL,&myit,NULL);
    struct sigaction act;
    act.sa_flags=0;
    sigemptyset(&act.sa_mask);
    act.sa_handler=touchfile;
    sigaction(SIGALRM,&act,NULL);
    while(1){
        //每隔一分钟在/home/.../log下创建文件
        sleep(1);
    }
    //推出
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

如果不sleep,则进程退出,创建的线程无法执行。

 

可以用pthread_exit()退出一个线程

 

 

 

 

“I will be out”不会执行。exit整个进程都退出了。

 

 

 

 

 

 

 (5s后打印第二句,阻塞等待)

 

 

 (同样效果)

 

 

 

 

 

 

 若while(1)中无代码,则无法杀死,即需要一个取消点。

 

 

 

 

 

 

创建多个线程:

 

 

 

 

 

(这种情况下num会不稳定,&i指向的值一直在变,num赋值时不一定是什么值)

 

 

 

 

 

 

 

多线程拷贝文件:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>

#define _THR_CNT_ 5

typedef struct _TaskInfo{
    int num;
    void* src;
    void* des;
    int size;
}TaskInfo;

void *thr(void* arg){
    TaskInfo* info=arg;
    int num=info->num;
    int cpsize=info->size/_THR_CNT_;
    int mod=info->size%_THR_CNT_;
    
    if(num==_THR_CNT_-1){
        memcpy(info->des+num*cpsize, info->src+num*cpsize, cpsize+mod);
    }else{
        memcpy(info->des+num*cpsize, info->src+num*cpsize, cpsize);
    }
    return NULL;
}

int main(int argc, char* argv[])
{
    if(argc!=3){
        printf("need srcfile and desfile\n");
        return -1;
    }
    int n=_THR_CNT_;
    struct stat sb;
    if(stat(argv[1],&sb)<0){
        perror(argv[1]);
        exit(1);
    }
    long filesize=sb.st_size;

    int fdsrc=open(argv[1],O_RDONLY);
    int fddes=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0666);
    ftruncate(fddes,filesize);

    if(fdsrc<0 || fddes<0){
        printf("open file %s %s err\n", argv[1], argv[2]);
        exit(1);
    }

    void* srcmem=mmap(NULL,filesize,PROT_READ,MAP_PRIVATE,fdsrc,0);
    if(srcmem==MAP_FAILED){
        perror("mmap srcfile err");
        exit(1);
    }

    void* desmem=mmap(NULL,filesize,PROT_READ|PROT_WRITE,MAP_SHARED,fddes,0);
    if(desmem==MAP_FAILED){
        perror("mmap desfile err");
        exit(1);
    }

    TaskInfo tasks[_THR_CNT_];
    pthread_t tid[_THR_CNT_];
    int i;
    for(i=0;i<n;i++){
        tasks[i].src=srcmem;
        tasks[i].des=desmem;
        tasks[i].num=i;
        tasks[i].size=filesize;
        pthread_create(&tid[i],NULL,thr,&tasks[i]);
    }

    for(i=0;i<n;i++){
        pthread_join(tid[i],NULL);
    }

    munmap(srcmem,filesize);
    munmap(desmem,filesize);

    return 0;
}

 

 

 

用守护进程写log:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void catch_alarm(int num){
    time_t nowtime=time(NULL);
    struct tm* nowtm=localtime(&nowtime);

    char strLogFile[100]={0};
    sprintf(strLogFile,"%s/log/touchevery.%04d%02d", getenv("HOME"),nowtm->tm_year+1900, nowtm->tm_mon+1);

    int fd=open(strLogFile,O_WRONLY|O_CREAT|O_APPEND,0666);
    if(fd<0){
        perror("open file err");
        printf("file is %s\n", strLogFile);
        exit(1);
    }

    char buf[2014]={0};
    sprintf(buf,"%02d-%02d %02d:%02d:%02d %s [%06d] %s\n", nowtm->tm_mon+1, nowtm->tm_mday, nowtm->tm_hour, nowtm->tm_min, nowtm->tm_sec, "touchevery",
            getpid(), "I am alive!");

    write(fd,buf,strlen(buf));
    close(fd);
}

int main()
{
    char *strHomeDir=getenv("HOME");
    pid_t pid=fork();
    if(pid>0){
        exit(1);
    }
    setsid();
    umask(0);
    chdir(strHomeDir);
    close(0);

    struct sigaction act;
    sigemptyset(&act.sa_mask);
    act.sa_flags=0;
    act.sa_handler=catch_alarm;
    sigaction(SIGALRM,&act,NULL);

    struct itimerval myit={{60,0},{1,0}};
    setitimer(ITIMER_REAL,&myit,NULL);

    while(1){
        sleep(120);
    }
    return 0;
}

 

posted @ 2020-05-19 21:56  feibilun  阅读(181)  评论(0编辑  收藏  举报