在学习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,转载请注明出处。
标签:day08,创建,线程,Linux,进程,include,守护,out From: https://blog.51cto.com/u_15405812/5832966