Linux线程1

守护进程

1.守护进程的特点

后台服务进程

独立于控制终端

周期性执行某任务

不受用户登录注销影响 一般采用以d结尾的名字(服务)

2 . 进 程 组

进程的组长

        组里边的第 一 进程

        进 程 组 的ID = = 进 程 中 的 组 长 的ID

进 程 中 组 长 的 选 择

        进 程 中 的 第 一 个 进 程

进 程 组ID 的 设 定

        进 程 组 的ID 就 是 组 长 的 进 程ID

3 . 会 话

创 建 一 个 会 话 注 意 事 项

        不能是进程组长

        创建会话的进程成为新进程组的组长

        有些linux 版本需要root权限执行此操作

        创 建 出 的 新 会 话 会 丢 弃 原 有 的 控 制 终 端

        一 般 步 骤 ; fork , 父亲死 儿子执行创建会话操作(setid)

获 取 进 程 所 属 的 会 话ID

        pid_t get sid(pid _ t pid) ;

创建一个会话

        pid _ t setid (void) ;

4 . 创建守护进程模型

        fork子进程,父进程退出

        子进程创建新会话

        改变当前工作目录chdir

        重设文件掩码

        关闭文件描述符

        执行核心工作

举个简单的例子,创建一个会话

显而易见,会话是不会显示在终端上面(但他依然存在于系统之中)

我们可以调用命令查看该进程,依然存在

当然,也可以执行kill 命令,杀死进程

线程的概念

主线程和子线程

共享:

.text

.bss

.data

动态加载区

环境变量

命令行参数

-通信:全局变量,堆

不共享

        一共五个线程,栈区被平均分成五块

在Linux下: 线程就是进程-轻量级进程

对于内核来说,线程就是进程

多进程和多线程的区别:

程: 始终共享的资源 代码、文件描述符、内存映射区--mmap

线程:始终共享的资源:堆、全局变量,节省资源

查看指定线程的LWP号(进程号):

        线程号和线程ID是有区别的

        线程号是给内核看的

查看方式 :

找到程序的进程ID

ps -Lf pid

例:我们打开一个软件,对应的会出现很多进程

我们通过进程的PID,从而查看其线程号LWP

这里的所有线程的PID都为同一个,当然LWP会有多个,这也是我们经常说的多线程任务

线程的创建

1.创建线程‐‐pthread_create 

int pthread_create( pthread_t *thread),          //线程ID = 无符号长整型                      const pthread_attr_t *attr,  //线程属性,NULL                      

                    void *(*start_routine)(void *), //线程处理函数                      

                    void *arg);   //线程处理函数 

参数:        

        pthread:传出参数,线程创建成功之后,会被设置一个合适的值        

        attr:默认传NULL        

        start_routine:子线程的处理函数        

        arg: 回调函数的参数 

返回值:          

        成功:0           

        错误:错误号  //perror不能使用该函数打印错误信息           

主线程先退出,子线程会被强制结束 

验证线程直接共享全局变量

注:最后的pthread_join(pthid,NULL);表示等待子线程的结束,否则主线程会先于子线程结束(后面会讲)

线程创建成功

2.单个线程退出 --pthread_exit exit(0)

函数原型: void pthread‐exit(void *retval);     

retval指针:必须指向全局,堆 

使用函数是主线程退出,所以子进程不会打印88888

使用exit退出整个进程

使用函数退出子线程

3.阻塞等待线程退出,获取线程退出状态--pthread_join

函数原型:    int pthread_join(pthread_t pthread, void **retval) 

参数:     

        pthread:要回收的子线程的ID      

        retval:读取线程退出的携带信息        

传出参数       

        void* ptr;       

        pthread_join(pthid,&ptr);       

        指向的内存和pthread_exit参数指向地址一致 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值