天天看点

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

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

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

一、学习目标

1、守护进程的特点

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

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

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

二、守护进程+线程

1、守护进程相关的概念

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

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

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

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

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

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

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

man 2 setsid

pid_t setsid(void);

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

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

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

前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相关的函数