IO进程线程、退出进程、进程回收、守护进程、线程创建、线程函数

一、退出进程的函数

1、exit()退出进程

_exit()函数的作用最为简单:直接使进程终止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;

exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。

exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是图中的"清理I/O缓冲"一项。

exit()是一个标准库函数。

结束当前进程,并且刷新所有缓存
void exit(int status);
参数虽然是int类型,但是它只有低8位有效

2、_exit()退出进程

_exit()函数的作用最为简单:直接使进程终止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;

_exit()函数是系统调用函数。

_exit()结束进程,但是不会刷新缓存,而是清空缓存

二、回收进程的函数

1、wait()回收子进程

调用该函数使进程阻塞,直到一个子进程结束或者是该进程接收到了一个信号为止。如果该进程没有子进程或者其子进程已经结束,wait函数会立即返回。

#include 
#include 
pid_t wait(int *status);
int *status: 为NULL时对退出进程的状态不关心;不为NULL时会接收子进程退出的状态
返回值:-1表示失败,成功返回结束的子进程的进程号

2、waitpid()可以指定回收子进程

功能和wait函数类似。可以指定等待某个子进程结束以及等待的方式(阻塞或非阻塞)

#include 
#include 
pid_t waitpid(pid_t pid, int *status, int options);
pid_t pid:>0回收指定子进程 =-1回收任意子进程 <-1回收其绝对值相等的子进程 
int *status:和wait参数一样
int options:0表示阻塞 WNOHANG表示非阻塞
返回值:使用选项WNOHANG且没有子进程结束时:0

三、守护进程

        守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件

        守护进程常常在系统启动时开始运行,在系统关闭时终止

        它从开始运行,直到整个系统关闭才会退出。如果想让某个进程不会因为用户或终端的变化而受到影响,就必须把这个进程变成一个守护进程。

进程组:

        进程组是一个或多个进程的集合。进程组由进程组ID来唯一标识。

每个进程组都有一个组长进程,进程组ID就是组长进程的进程号。(比如一个终端里面运行的进程都在一个进程组中,组长是运行的shell进程)

会话期:

会话组是一个或多个进程组的集合

守护进程创建的流程:

1.创建子进程,父进程退出 :变成孤儿进程(后台) ----------------------------------->fork()

2.在子进程中创建新会话 :脱离shell(与终端无关) ----------------------------------->setsid()

3.改变当前目录为根目录 :避免守护进程的工作目录别卸载 -------------------------->chdir()

4.重设文件权限掩码 :用户可以任意指定文件的权限 --------------------------------->umask()

5.关闭文件描述符 :关闭已经打开的文件描述符 ----------------------------------------->close()

四、线程

        每个用户进程有自己的地址空间,系统为每个用户进程创建一个task_struct来描述该进程,该结构体中包含了一个指针指向该进程的虚拟地址空间映射表。

线程一般由第三方库实现。Linux使用线程库 pthread。

1、同一个进程中的线程间共享的资源

可执行的指令

静态数据

进程中打开的文件描述符

信号处理函数

当前工作目录

用户ID

用户组ID

2、同一个进程中的线程私有的资源

线程ID (TID)

PC(程序计数器)和相关寄存器

堆栈

局部变量

返回地址

错误号 (errno)

信号掩码和优先级

执行状态和属性

3、线程的基本操作

  1. 创建线程:

    #include 
    int  pthread_create(pthread_t *thread,  const pthread_attr_t  *attr,  void * (* routine)(void *),  void *arg)
    返回值:成功返回0, 失败返回错误码  因为线程是第三方库所以不能使用perror打印错误信息
    pthread_t *thread:生成的线程ID
    const pthread_attr_t  *attr:线程的属性,一般默认(缺省)NULL
    void * (* routine)(void *):线程的执行函数
    void *arg:线程执行函数的参数
    ​
    注意:多线程中如果主线程结束,那么依赖于这个进程的所有线程都会被结束。
    ​
    等待线程结束:
    int  pthread_join(pthread_t thread,  void **value_ptr) ;
    pthread_t thread:要等待的线程id
    void **value_ptr:该线程退出的值
    ​
    线程退出函数:
    void  pthread_exit(void *value_ptr) ;
    
  2. 删除线程

    int pthread_cancel(pthread_t thread);
    返回值:0表示成功 失败返回错误码
    pthread_t thread:要删除的线程

你可能感兴趣的:(linux,进程线程)