在学习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,转载请注明出处。