Linux4:线程
守护进程
守护进程的特点
后台服务进程
独立于控制终端
周期性执行某任务
不受用户登录注销影响
一般采用以d结尾的名字(服务)
进程组
进程的组长:
组里边的第一进程
进程组的ID==进程中的组长的ID
进程中组长的选择:进程中的第一个进程
进程组ID的设定:进程组的ID就是组长的进程ID
会话
创建一个会话注意事项
不能是进程组长
创建会话的进程成为新进程组的组长
有些lInux版本需要root权限执行此操作
创建出的新会话会丢弃原有的控制终端
一般步骤;fork ,父亲死,儿子执行创建会话操作(setsid)
获取进程所属的会话ID:pid_t getsid(pid_t pid);
创建一个会话:pid_t setsid(void);
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>int main()
{pid_t pid;pid = fork();if(pid > 0){kill(getpid(),SIGKILL);//raise(SIGKILL);//exit(1);}else if(pid == 0){setsid();while(1);}return 0;
}
~
~
注:后台服务,独立于控制终端
创建守护进程模型
fork子进程,父进程退出:必须
子进程创建新会话:必须
改变当前工作目录chdir:非必须
重设文件掩码:非必须,子进程会继承父进程的掩码,增加子进程程序操作的灵活性,umask(0)
关闭文件描述符:非必须
close(0)
close(1)
close(2)
释放占用资源
执行核心工作:必须
线程的概念
1.主线程和子线程,共享:
- .text
- .bss
- .data
- 堆
- 动态加载区
- 环境变量
- 命令行参数
-通信:全局变量,堆
不共享,一共五个线程,栈区被平均分成五块
2.在Linux下: 线程就是进程-轻量级进程
对于内核来说,线程就是进程
多进程和多线程的区别:
多进程: 始终共享的资源代码、文件描述符、内存映射区--mmap
多线程:始终共享的资源:堆、全局变量,节省资源
3.安卓线程man page ,命令:sudo apt-get install manpages-posix-dev
4.查看指定线程的LWP号:
线程号和线程ID是有区别的:线程号是给内核看的
查看方式:1.找到程序的进程ID 2. ps -Lf pid
线程的创建
创建线程‐‐pthread_create
int pthread_create( pthread_t *pthread, //线程ID = 无符号长整型
const pthread_attr_t *attr, //线程属性,NULL
void *(*start_routine)(void *), //线程处理函数
void *arg); //线程处理函数
参数:
pthread:传出参数,线程创建成功之后,会被设置一个合适的值
attr:默认传NULL
start_routine:子线程的处理函数
arg:回调函数的参数
返回值:
成功:0
错误:错误号 //perror不能使用该函数打印错误信息
主线程先退出,子线程会被强制结束
验证线程直接共享全局变量
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>void* myfun(void* argv)
{printf("child pathread id is %ld\n",pthread_self());return 0;
}int main()
{pthread_t pthid;pthread_create(&pthid,NULL,myfun,NULL);printf("parent pathread id is %ld\n",pthread_self());for(int i = 0;i < 5;i++){printf("i = %d\n",i);}sleep(2);return 0;
}
注意:要连接pthread库!!
要主线程睡眠才能执行子线程,否则父线程退出,子线程自动结束