Linux系统编程——09-linux-day08(守护进程-线程)

    技术2024-12-30  11

    在学习Linux系统编程总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

    09-linux-day08(守护进程-线程)

     

     

    一、学习目标

    1、守护进程的特点

    2、熟练进行守护进程的创建

    3、熟练掌握多线程的创建

    4、熟练掌握线程的退出和资源回收

     

    二、守护进程+线程

    1、守护进程相关的概念

     

    会话:进程组的更高一级,多个进程组对应一个会话。

    进程组:多个进程在同一个组,第一个进程默认是进程组的组长。

    创建会话的时候,组织不可以创建,必须是组员创建。

    创建会话的步骤:创建子进程,父进程死去,子进程自当会长。

    》setsid——调用后就成为会长

    man 2 setsid

    pid_t setsid(void);

     (例如:如果按照了mysql,可以通过ps aus | grep mysqld查看mysql的守护进程)

    前2步骤是必须的!

     

    2、守护进程创建

    》需求:创建一个守护进程:每分钟在$HOME/log/ 创建一个文件,程序名.时间戳

    >touch daemon.c

    >vi daemon.c

    1 #include<stdio.h> 2 #include<unistd.h> 3 #include<fcntl.h> 4 #include<stdlib.h> 5 #include<sys/types.h> 6 #include<sys/stat.h> 7 #include<string.h> 8 #include<signal.h> 9 #include<sys/time.h> 10 #include<time.h> 11 12 #define _FILE_NAME_FORMAT_ "%s/log/mydaemon.%ld" //定义文件格式化 13 14 void touchfile(int num){ 15 char *HomeDir = getenv("HOME"); 16 char strFilename[256]={0}; 17 18 sprintf(strFilename,_FILE_NAME_FORMAT_,HomeDir,time(NULL)); 19 20 int fd = open(strFilename,O_RDWR|O_CREAT,0666); 21 22 if(fd < 0){ 23 perror("open err"); 24 exit(1); 25 } 26 close(fd); 27 } 28 29 30 int main(int argc, char *argv[]) 31 { 32 //创建子进程,父进程退出 33 pid_t pid = fork(); 34 if(pid > 0){ 35 exit(1); 36 } 37 //当会长 38 setsid(); 39 //设置掩码 40 umask(0); 41 //切换目录 42 chdir(getenv("HOME"));//切换到家目录 43 //关闭文件描述符 44 //close(0),close(1),close(2);//方便调试,不关 45 //执行核心逻辑 46 //struct itimerval myit = {{60,0},{60,0}}; 47 struct itimerval myit = {{60,0},{1,0}};//方便调试,初始改为1s 48 setitimer(ITIMER_REAL,&myit,NULL); 49 struct sigaction act; 50 act.sa_flags = 0; 51 sigemptyset(&act.sa_mask); 52 act.sa_handler = touchfile; 53 54 sigaction(SIGALRM,&act,NULL); 55 56 while(1){ 57 //每隔1分钟在/home/wang/log下创建文件 58 sleep(1); 59 //do sth 60 } 61 //退出 62 63 return 0; 64 }

    >gcc daemon.c

    >./a.out

    (打开另一个终端,ps aux查看a.out为守护进程,然后在原终端点叉子关闭a.out,在后打开的终端查看a.out仍然存在。,另外要进入log文件夹下查看目录是否仍然在目录。)

     

    3、守护进程扩展了解

    扩展了解:

      通过nohup指令也可以达到守护进程创建的效果。

      用法:nohup cmd [ > 1.log ] &

        nohup指令会让cmd收不到SIGHUP信号

        & 代表后台运行

    >touch daemon1.c

    >vi daemon1.c

    1 #include<stdio.h> 2 #include<unistd.h> 3 #include<fcntl.h> 4 #include<stdlib.h> 5 #include<string.h> 6 #include<sys/types.h> 7 #include<time.h> 8 9 10 int main(int argc, char *argv[]) 11 { 12 char strfileName[256] = {0}; 13 14 while(1){ 15 memset(strFileName,0x00,sizeof(strFileName)); 16 sprintf(strFileName,"%s/log/zhen2.%ld",getenv("HOME"),time(NULL)); 17 int fd = open(strFileName,O_RDONLY|O_CREAT,0664); 18 if(fd < 0){ 19 perror("open err"); 20 exit(1); 21 } 22 close(fd); 23 sleep(5); 24 } 25 26 return 0; 27 }

    >gcc daemon1.c

    >./a.out

    >nohup ./a.out &

    (显示:[1] 3451 忽略输入并把输出追加到'nohup.out';打开另一个终端输入ps aux查看,然后再终端点击叉子关闭,后打开的进程输入ps aux发现a.out仍然活着,另外要进入log文件夹下查看目录是否仍然在创建目录。)

     

    4、线程有关的概念

     

     

    5、线程的优点和缺点

     

     

    6、创建一个线程

     

     

    7、线程的退出

     

     

    8、线程的回收

     

     

    9、杀死线程

     

     

    10、线程分离

     

     

    11、线程属性设置分离

     

     

    12、线程注意事项

     

     

    13、线程同步的概念

     

     

    14、mutex相关的函数

     

     

     

     

    在学习Linux系统编程总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

    Processed: 0.015, SQL: 9