Linux4:线程

守护进程

守护进程的特点

后台服务进程

独立于控制终端

周期性执行某任务

不受用户登录注销影响

一般采用以d结尾的名字(服务)

进程组

进程的组长:

组里边的第一进程

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

进程中组长的选择:进程中的第一个进程

进程组ID的设定:进程组的ID就是组长的进程ID

会话

创建一个会话注意事项

不能是进程组长

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

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

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

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

获取进程所属的会话ID:pid_t getsid(pid_t pid);

创建一个会话:pid_t setsid(void);

cs 复制代码
#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.主线程和子线程,共享:

  1. .text
  2. .bss
  3. .data
  4. 堆
  5. 动态加载区
  6. 环境变量
  7. 命令行参数

-通信:全局变量,堆

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

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不能使用该函数打印错误信息

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

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

cs 复制代码
#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库!!

要主线程睡眠才能执行子线程,否则父线程退出,子线程自动结束

相关推荐
jaronho15 分钟前
【脚本】 【Linux】启动所有网卡
linux·运维·服务器
草莓熊Lotso16 分钟前
【C++ 基于微服务的即时通讯系统】基建三件套:gflags + gtest + spdlog 源码编译安装与实战入门
linux·网络·数据库·c++·微服务·log4j
JavaPub-rodert25 分钟前
服务器不能访问 Docker Hub,镜像怎么搬过去?讲透 docker save、load、export、import 与离线镜像分发
运维·服务器·docker
H.莓飛27 分钟前
【C++】类与对象(末):static、友元与拷贝优化
linux·开发语言·c++·visual studio
EasyGBS9 小时前
摄像头还在线,画面已经不能用了?国标GB28181视频平台EasyGBS视频质量诊断怎么用
服务器·安全·音视频
程序员-Benothing9 小时前
Vim编辑器从入门到精通:模式、快捷键、配置、插件
linux·运维·服务器
m0_646429979 小时前
Docker 完整核心知识点总结(超通俗易懂版)
运维·docker·容器
wdfk_prog9 小时前
LWIP教程 09:从 `tcp_slowtmr()` 到 Fast Retransmit——TCP 超时重传与重复 ACK
服务器·网络·数据库·网络协议·tcp/ip
‎ദ്ദിᵔ.˛.ᵔ₎9 小时前
linux 进程信号 (上)
linux·服务器