Linux进程
2022-05-06 10:23:41 12 举报
AI智能生成
Linux进程是指在Linux操作系统中运行的程序实例。每个进程都有自己的独立内存空间,可以与其他进程并行执行。进程之间通过系统调用进行通信和资源分配。Linux进程包括三个基本状态:运行、就绪和等待。运行状态是指进程正在CPU上执行;就绪状态是指进程已经准备好运行,但尚未获得CPU的执行权;等待状态是指进程正在等待某个事件(如I/O操作完成)而暂时停止执行。Linux进程还具有优先级,用于决定哪个进程优先获得CPU的执行权。此外,Linux进程还包括父进程和子进程的关系,子进程是父进程的副本,可以通过继承父进程的资源和环境来执行特定的任务。
作者其他创作
大纲/内容
文件io
文件描述符
文件描述符是非负整数。打开现存文件或新建文件时,系统(内核)会返回一个文件描述
符。文件描述符用来指定已打开的文件。
在系统调用(文件IO)中,文件描述符对文件起到标识作用,如果要操作文件,就是对文件
描述符的操作
符。文件描述符用来指定已打开的文件。
在系统调用(文件IO)中,文件描述符对文件起到标识作用,如果要操作文件,就是对文件
描述符的操作
open函数
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 5
int open(const char *pathname, int flags);
6 int open(const char *pathname, int flags, mode_t mode);
7 功能:打开或者创建一个文件,返回文件描述符
8 参数:
9 pathname:指定路径的文件名,不指定路径默认为当前路径
10 flags:标志位
11 O_RDONLY 只读
12 O_WRONLY 只写
13 O_RDWR 读写
14 O_CREAT 文件不存在则创建,需要通过第三个参数设置文件权限
15 O_EXCL 一般与O_CREAT一起使用,标识如果文件存在则报错
16 O_TRUNC 如果文件存在则清空
17 O_APPEND 如果文件存在则追加
18 mode:文件权限,当指定flags中有O_CREAT时,必须有这个参数,
19 如果没有O_CREAT,则不需要这个参数
20 返回值:
21 成功:文件描述符
22 失败:‐1
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 5
int open(const char *pathname, int flags);
6 int open(const char *pathname, int flags, mode_t mode);
7 功能:打开或者创建一个文件,返回文件描述符
8 参数:
9 pathname:指定路径的文件名,不指定路径默认为当前路径
10 flags:标志位
11 O_RDONLY 只读
12 O_WRONLY 只写
13 O_RDWR 读写
14 O_CREAT 文件不存在则创建,需要通过第三个参数设置文件权限
15 O_EXCL 一般与O_CREAT一起使用,标识如果文件存在则报错
16 O_TRUNC 如果文件存在则清空
17 O_APPEND 如果文件存在则追加
18 mode:文件权限,当指定flags中有O_CREAT时,必须有这个参数,
19 如果没有O_CREAT,则不需要这个参数
20 返回值:
21 成功:文件描述符
22 失败:‐1
close函数
#include <unistd.h>
2 int close(int fd);
3 功能:关闭一个文件描述符
4 参数:5 fd:指定文件的文件描述符,open函数的返回值
6 返回值:
7 成功:0
8 失败:‐1
2 int close(int fd);
3 功能:关闭一个文件描述符
4 参数:5 fd:指定文件的文件描述符,open函数的返回值
6 返回值:
7 成功:0
8 失败:‐1
write函数
1 #include <unistd.h>
2 ssize_t write(int fd, const void *buf, size_t count);3 功能:向文件写入数据
4 参数:
5 fd:指定的文件描述符
6 buf:要写入的数据
7 count:要写入的数据的长度
8 返回值:
9 成功:实际写入的字节数
10 失败:‐1
2 ssize_t write(int fd, const void *buf, size_t count);3 功能:向文件写入数据
4 参数:
5 fd:指定的文件描述符
6 buf:要写入的数据
7 count:要写入的数据的长度
8 返回值:
9 成功:实际写入的字节数
10 失败:‐1
read函数
1 #include <unistd.h>
2 ssize_t read(int fd, void *buf, size_t count);
3 功能:从文件中读取数据
4 参数:
5 fd:指定的文件描述符
6 buf:保存读取到的数据
7 count:最大一次读取多少个字节
8 返回值:
9 成功:实际读取的字节数
10 失败:‐1
11 注意:如果读取到文件末尾,返回0
2 ssize_t read(int fd, void *buf, size_t count);
3 功能:从文件中读取数据
4 参数:
5 fd:指定的文件描述符
6 buf:保存读取到的数据
7 count:最大一次读取多少个字节
8 返回值:
9 成功:实际读取的字节数
10 失败:‐1
11 注意:如果读取到文件末尾,返回0
进程
进程定义
程序是一些指令的有序集合,而进程是程序执行的过程,进程是程序的一次执行过程。
进程的状态是变化的,其包括进程的创建、调度和消亡。
只要程序运行,此时就是进程,程序每运行一次,就会创建一个进程
进程的状态是变化的,其包括进程的创建、调度和消亡。
只要程序运行,此时就是进程,程序每运行一次,就会创建一个进程
进程控制块
进程控制块就是用于保存一个进程信息的结构体,又称之为PCB
进程号及其创建
每个进程都由一个进程号来标识,其类型为pid_t,进程号的范围:0~32767
进程号是由操作系统随机给当前进程分配的,不能自己控制
进程号总是唯一的,但进程号可以重用。当一个进程终止后,其进程号就可以再次使用了
进程号是由操作系统随机给当前进程分配的,不能自己控制
进程号总是唯一的,但进程号可以重用。当一个进程终止后,其进程号就可以再次使用了
Linux操作系统提供了三个获得进程号的函数getpid()、getppid()、getpgid()。
#include <unistd.h>
2 pid_t fork(void);
3 功能:在已有的进程基础上有创建一个子进程
4 参数:
5 无
6 返回值:
7 成功:
8 >0 子进程的进程号,标识父进程的代码区
9 0 子进程的代码区
10 失败:
11 ‐1 返回给父进程,子进程不会创建
2 pid_t fork(void);
3 功能:在已有的进程基础上有创建一个子进程
4 参数:
5 无
6 返回值:
7 成功:
8 >0 子进程的进程号,标识父进程的代码区
9 0 子进程的代码区
10 失败:
11 ‐1 返回给父进程,子进程不会创建
进程等待
#include <sys/types.h>
2 #include <sys/wait.h>
3 pid_t wait(int *status);
4 功能:等待子进程终止,如果子进程终止了,此函数会回收子进程的资源。
5 调用wait函数的进程会挂起,直到它的一个子进程退出或收到一个不能被忽视的信号时才
被唤醒。
6 若调用进程没有子进程或它的子进程已经结束,该函数立即返回。
7 参数:
8 status:函数返回时,参数status中包含子进程退出时的状态信息。
9 子进程的退出信息在一个int中包含了多个字段,
10 用宏定义可以取出其中的每个字段
11 子进程可以通过exit或者_exit函数发送退出状态
12 返回值:
13 成功:子进程的进程号。
2 #include <sys/wait.h>
3 pid_t wait(int *status);
4 功能:等待子进程终止,如果子进程终止了,此函数会回收子进程的资源。
5 调用wait函数的进程会挂起,直到它的一个子进程退出或收到一个不能被忽视的信号时才
被唤醒。
6 若调用进程没有子进程或它的子进程已经结束,该函数立即返回。
7 参数:
8 status:函数返回时,参数status中包含子进程退出时的状态信息。
9 子进程的退出信息在一个int中包含了多个字段,
10 用宏定义可以取出其中的每个字段
11 子进程可以通过exit或者_exit函数发送退出状态
12 返回值:
13 成功:子进程的进程号。
3 pid_t waitpid(pid_t pid, int *status,int options)
4 功能:等待子进程终止,如果子进程终止了,此函数会回收子进程的资源
4 功能:等待子进程终止,如果子进程终止了,此函数会回收子进程的资源
进程终止
#include <unistd.h>
2 void _exit(int status);
3 功能:退出当前进程
4 参数:
5 status:退出状态,由父进程通过wait函数接收这个状态
6 一般失败退出设置为非0
7 一般成功退出设置为0
8 返回值:
9 无
2 void _exit(int status);
3 功能:退出当前进程
4 参数:
5 status:退出状态,由父进程通过wait函数接收这个状态
6 一般失败退出设置为非0
7 一般成功退出设置为0
8 返回值:
9 无
exit和_exit函数的区别:
exit为库函数,而_exit为系统调用
exit会刷新缓冲区,但是_exit不会刷新缓冲区
一般会使用exit
exit为库函数,而_exit为系统调用
exit会刷新缓冲区,但是_exit不会刷新缓冲区
一般会使用exit
进程创建vfork
fork和vfork函数的区别:
vfork保证子进程先运行,在它调用exec或exit之后,父进程才可能被调度运行。
vfork和fork一样都创建一个子进程,但它并不将父进程的地址空间完全复制到子进程
中,因为子进程会立即调用exec(或exit),于是也就不访问该地址空间。
相反,在子进程中调用exec或exit之前,它在父进程的地址空间中运行,在exec之后子
进程会有自己的进程空间
vfork保证子进程先运行,在它调用exec或exit之后,父进程才可能被调度运行。
vfork和fork一样都创建一个子进程,但它并不将父进程的地址空间完全复制到子进程
中,因为子进程会立即调用exec(或exit),于是也就不访问该地址空间。
相反,在子进程中调用exec或exit之前,它在父进程的地址空间中运行,在exec之后子
进程会有自己的进程空间
exec函数族
exec函数族
2 #include <unistd.h>
3 int execl(const char *path, const char *arg, .../* (char *) NULL */);
4 int execlp(const char *file, const char *arg, .../* (char *) NULL */);
5 int execv(const char *path, char *const argv[]);
6 int execvp(const char *file, char *const argv[]);
7 int execle(const char *path, const char *arg, .../*, (char *) NULL*/, cha
r * const envp[] );
8 int execvpe(const char *file, char *const argv[], char *const envp[]);
9 功能:在一个进程里面执行另一个程序,主要用于执行命令
10 参数:
11 path:命令或者程序的路径
12 l:如果是带l的函数,对应的命令或者程序是通过每一个参数进行传
13 递的,最后一个为NULL表示结束
14 例如:"ls", "‐l", NULL
15 v:如果是带v的函数,对应的命令或者程序是通过一个指针数组来传递的,
16 指针数组的最后一个元素为NULL标识结束
17 char *str[] = {"ls", "‐l", NULL};
18 p:如果是不带p的函数,第一个参数必须传当前命令或者程序的绝对路径,
19 如果是带p的函数,第一个参数既可以是绝对路径,也可以是相对路径
20 返回值:
21 失败:‐1
2 #include <unistd.h>
3 int execl(const char *path, const char *arg, .../* (char *) NULL */);
4 int execlp(const char *file, const char *arg, .../* (char *) NULL */);
5 int execv(const char *path, char *const argv[]);
6 int execvp(const char *file, char *const argv[]);
7 int execle(const char *path, const char *arg, .../*, (char *) NULL*/, cha
r * const envp[] );
8 int execvpe(const char *file, char *const argv[], char *const envp[]);
9 功能:在一个进程里面执行另一个程序,主要用于执行命令
10 参数:
11 path:命令或者程序的路径
12 l:如果是带l的函数,对应的命令或者程序是通过每一个参数进行传
13 递的,最后一个为NULL表示结束
14 例如:"ls", "‐l", NULL
15 v:如果是带v的函数,对应的命令或者程序是通过一个指针数组来传递的,
16 指针数组的最后一个元素为NULL标识结束
17 char *str[] = {"ls", "‐l", NULL};
18 p:如果是不带p的函数,第一个参数必须传当前命令或者程序的绝对路径,
19 如果是带p的函数,第一个参数既可以是绝对路径,也可以是相对路径
20 返回值:
21 失败:‐1
进程间通信
信号
信号概念
信号是软件中断,它是在软件层次上对中断机制的一种模拟。
信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个
突发事件。
信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个
突发事件。
kill函数
#include <sys/types.h>
2 #include <signal.h>
3 int kill(pid_t pid, int sig);
4 功能:给指定的进程或者进程组发送信号
5 参数:
6 pid:
7 pid>0: 将信号传送给进程ID为pid的进程。
8 pid=0: 将信号传送给当前进程所在进程组中的所有进程。
9 pid=‐1: 将信号传送给系统内所有的进程,除了init进程
10 pid<‐1: 将信号传给指定进程组的所有进程。这个进程组号等于pid的绝对值。
11 sig:指定的信号
12 返回值:
13 成功:0
14 失败:‐1
2 #include <signal.h>
3 int kill(pid_t pid, int sig);
4 功能:给指定的进程或者进程组发送信号
5 参数:
6 pid:
7 pid>0: 将信号传送给进程ID为pid的进程。
8 pid=0: 将信号传送给当前进程所在进程组中的所有进程。
9 pid=‐1: 将信号传送给系统内所有的进程,除了init进程
10 pid<‐1: 将信号传给指定进程组的所有进程。这个进程组号等于pid的绝对值。
11 sig:指定的信号
12 返回值:
13 成功:0
14 失败:‐1
alarm函数
#include <unistd.h>
2 unsigned int alarm(unsigned int seconds);
3 功能:定时器,闹钟,当设定的时间到达时,会产生SIGALRM信号
4 参数:
5 seconds:设定的秒数
6 返回值:
7 如果alarm函数之前没有alarm设置,则返回0
8 如果有,则返回上一个alarm剩余的时间
2 unsigned int alarm(unsigned int seconds);
3 功能:定时器,闹钟,当设定的时间到达时,会产生SIGALRM信号
4 参数:
5 seconds:设定的秒数
6 返回值:
7 如果alarm函数之前没有alarm设置,则返回0
8 如果有,则返回上一个alarm剩余的时间
raise函数
#include <signal.h>
2 int raise(int sig);
3 功能:给调用进程本身发送信号
4 参数:5 sig:指定的信号
6 返回值:
7 成功:0
8 失败:非0
9 1
0 raise(sig) <==> kill(getpid(), sig)
2 int raise(int sig);
3 功能:给调用进程本身发送信号
4 参数:5 sig:指定的信号
6 返回值:
7 成功:0
8 失败:非0
9 1
0 raise(sig) <==> kill(getpid(), sig)
abort函数
#include <stdlib.h>
2 void abort(void);
3 功能:向进程发送一个SIGABRT信号,默认情况下进程会退出。
4 参数:无
5 返回值:无
2 void abort(void);
3 功能:向进程发送一个SIGABRT信号,默认情况下进程会退出。
4 参数:无
5 返回值:无
pause函数
#include <unistd.h>
2 int pause(void);
3 功能:阻塞等待一个信号的产生
4 参数:
5 无
6 返回值:
7 当有信号产生时,函数返回‐1
2 int pause(void);
3 功能:阻塞等待一个信号的产生
4 参数:
5 无
6 返回值:
7 当有信号产生时,函数返回‐1
signal函数
#include <signal.h>
2 void (*signal(int sig, void (*func)(int)))(int);
3 ‐‐>
4 typedef void (*sighandler_t)(int);
5 sighandler_t signal(int signum, sighandler_t handler);
6 功能:当进程中产生某一个信号时,对当前信号进行处理
7 参数:
8 sig:指定要处理的信号
9 handler:处理方式
10 SIG_IGN 当信号产生时,以缺省(忽略)的方式处理
11 SIG_DFL 当信号产生时,以当前信号默认的方式处理
12 void handler(int sig):当信号产生时,通过信号处
13 理函数自定义方式处理,函数名可以随便写,
14 参数表示当前的信号
15 返回值:
16 成功:返回函数地址,该地址为此信号上一次注册的信号处理函数的地址
17 失败:SIG_ERR
2 void (*signal(int sig, void (*func)(int)))(int);
3 ‐‐>
4 typedef void (*sighandler_t)(int);
5 sighandler_t signal(int signum, sighandler_t handler);
6 功能:当进程中产生某一个信号时,对当前信号进行处理
7 参数:
8 sig:指定要处理的信号
9 handler:处理方式
10 SIG_IGN 当信号产生时,以缺省(忽略)的方式处理
11 SIG_DFL 当信号产生时,以当前信号默认的方式处理
12 void handler(int sig):当信号产生时,通过信号处
13 理函数自定义方式处理,函数名可以随便写,
14 参数表示当前的信号
15 返回值:
16 成功:返回函数地址,该地址为此信号上一次注册的信号处理函数的地址
17 失败:SIG_ERR
管道和有名管道
无名管道概述
管道(pipe)又称无名管道。
无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符
无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符
无名管道创建pipe函数
#include <unistd.h>
2 int pipe(int pipefd[2]);
3 功能:创建一个有名管道,返回两个文件描述符负责对管道进行读写操作
4 参数:
5 pipefd:int型数组的首地址,里面有两个元素
6 pipefd[0] 负责对管道执行读操作
7 pipefd[1] 负责对管道执行写操作
8 返回值:
9 成功:0
10 失败:‐1
2 int pipe(int pipefd[2]);
3 功能:创建一个有名管道,返回两个文件描述符负责对管道进行读写操作
4 参数:
5 pipefd:int型数组的首地址,里面有两个元素
6 pipefd[0] 负责对管道执行读操作
7 pipefd[1] 负责对管道执行写操作
8 返回值:
9 成功:0
10 失败:‐1
无名管道的读写规律
/读写端都存在,只读不写
15 //如果管道中有数据,会正常读取数据
16 //如果管道中没有数据,则读操作会阻塞等待,直到有数据为止
15 //如果管道中有数据,会正常读取数据
16 //如果管道中没有数据,则读操作会阻塞等待,直到有数据为止
/读写端都存在,只写不读
15 //如果一直执行写操作,则无名管道对应的缓冲区会被写满,写满之后,write函数也
会阻塞等待
16 //默认无名管道的缓冲区64K字节
15 //如果一直执行写操作,则无名管道对应的缓冲区会被写满,写满之后,write函数也
会阻塞等待
16 //默认无名管道的缓冲区64K字节
//关闭写文件描述符,只有读端
18 //如果原本管道中有数据,则读操作正常读取数据
19 //如果管道中没有数据,则read函数会返回0
18 //如果原本管道中有数据,则读操作正常读取数据
19 //如果管道中没有数据,则read函数会返回0
//关闭写操作文件描述符,只有写端
23 //如果关闭读端,一旦执行写操作,就会产生一个信号SIGPIPE(管道破裂),
24 //这个信号的默认处理方式是退出进程
23 //如果关闭读端,一旦执行写操作,就会产生一个信号SIGPIPE(管道破裂),
24 //这个信号的默认处理方式是退出进程
有名管道概述
命名管道(FIFO)和管道(pipe)基本相同,但也有一些显著的不同,
有名管道创建
方法2:使用函数mkfifo
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 int mkfifo(const char *pathname, mode_t mode);
5 功能:创建一个有名管道,产生一个本地文件系统可见的文件pathname
6 参数:
7 pathname:有名管道创建后生成的文件,可以带路径
8 mode:管道文件的权限,一般通过八进制数设置即可,例如0664
9 返回值:
10 成功:0
11 失败:‐1
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 int mkfifo(const char *pathname, mode_t mode);
5 功能:创建一个有名管道,产生一个本地文件系统可见的文件pathname
6 参数:
7 pathname:有名管道创建后生成的文件,可以带路径
8 mode:管道文件的权限,一般通过八进制数设置即可,例如0664
9 返回值:
10 成功:0
11 失败:‐1
有名管道的读写规律
/读写端都存在,只读不写
21 //如果原本管道中有数据,则正常读取
22 //如果管道中没有数据,则read函数会阻塞等待
21 //如果原本管道中有数据,则正常读取
22 //如果管道中没有数据,则read函数会阻塞等待
//读写端都存在,只写不读
21 //当有名管道的缓冲区写满后,write函数会发生阻塞
22 //默认有名管道的缓冲区为64K字节
21 //当有名管道的缓冲区写满后,write函数会发生阻塞
22 //默认有名管道的缓冲区为64K字节
//在一个进程中,只有读端,没有写端
21 //会在open函数的位置阻塞
21 //会在open函数的位置阻塞
//在一个进程中,只有写端,没有读端
21 //会在open函数的位置阻塞
21 //会在open函数的位置阻塞
消息队列
消息队列概述
消息队列是消息的链表,存放在内存中,由内核维护
消息队列函数
#include <sys/types.h>
2 #include <sys/ipc.h>
3 key_t ftok(const char *pathname, int proj_id);
4 功能:通过文件名和目标值共同创造一个键值并返回值
5 参数:
6 pathname:任意一个文件名(文件名或者目录名)
7 proj_id:目标值,范围一般是0~127
8 返回值:
9 成功:键值
10 失败:‐1
11
12 如果使用ftok函数获取键值,得到的键值是由ftok的第一个
13 参数对应文件的信息和第二个参数一起决定的
2 #include <sys/ipc.h>
3 key_t ftok(const char *pathname, int proj_id);
4 功能:通过文件名和目标值共同创造一个键值并返回值
5 参数:
6 pathname:任意一个文件名(文件名或者目录名)
7 proj_id:目标值,范围一般是0~127
8 返回值:
9 成功:键值
10 失败:‐1
11
12 如果使用ftok函数获取键值,得到的键值是由ftok的第一个
13 参数对应文件的信息和第二个参数一起决定的
#include <sys/types.h>
2 #include <sys/ipc.h>
3 #include <sys/msg.h>
4 int msgget(key_t key, int msgflg);
5 功能:创建一个消息队列,得到消息队列的id
6 参数:
7 key:键值,唯一的键值确定唯一的消息队列
8 方法1:任意指定一个数
9 方法2:使用ftok函数获取键值
10 msgflg:消息队列的访问权限,
11 一般设置为 IPC_CREAT | IPC_EXCL | 0777 或者 IPC_CREAT | 0777
12 返回值:
13 成功:消息队列的id
2 #include <sys/ipc.h>
3 #include <sys/msg.h>
4 int msgget(key_t key, int msgflg);
5 功能:创建一个消息队列,得到消息队列的id
6 参数:
7 key:键值,唯一的键值确定唯一的消息队列
8 方法1:任意指定一个数
9 方法2:使用ftok函数获取键值
10 msgflg:消息队列的访问权限,
11 一般设置为 IPC_CREAT | IPC_EXCL | 0777 或者 IPC_CREAT | 0777
12 返回值:
13 成功:消息队列的id
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
5 功能:向指定的消息队列发送数据(写操作)
5 功能:向指定的消息队列发送数据(写操作)
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz,
5 long msgtyp, int msgflg);
6 功能:从消息队列中接收数据(读操作),接收的数据会从消息队列中删除
5 long msgtyp, int msgflg);
6 功能:从消息队列中接收数据(读操作),接收的数据会从消息队列中删除
4 int msgctl(int msqid, int cmd, struct msqid_ds *buf);
5 功能:设置或者获取消息队列的信息
5 功能:设置或者获取消息队列的信息
共享内存
共享内存概述
共享内存允许两个或者多个进程共享给定的存储区域
共享内存函数
int shmget(key_t key, size_t size, int shmflg);
4 功能:创建一个共享内存
4 功能:创建一个共享内存
void *shmat(int shmid, const void *shmaddr, int shmflg);
4 功能:映射共享内存
4 功能:映射共享内存
int shmdt(const void *shmaddr);
4 功能:解除共享内存的映射
4 功能:解除共享内存的映射
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
4 功能:设置或者获取共享内存你的属性
4 功能:设置或者获取共享内存你的属性
线程
线程概念
线程存在于进程中,共享进程的资源
线程创建
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
3 void *(*start_routine) (void *), void *arg);
4 功能:创建一个新的子线程
3 void *(*start_routine) (void *), void *arg);
4 功能:创建一个新的子线程
线程等待
int pthread_join(pthread_t thread, void **retval);
3 功能:阻塞等待一个子线程的退出,
4 可以接收到某一个子线程调用pthread_exit时设置的退出状态值
3 功能:阻塞等待一个子线程的退出,
4 可以接收到某一个子线程调用pthread_exit时设置的退出状态值
线程分离
linux线程执行和windows不同,pthread有两种状态:
可结合的(joinable)或者是分离的(detached),线程默认创建为可结合态。
如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会
释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join
之后这些资源才会被释放。
若是detached状态的线程,这些资源在线程函数退出时或pthread_exit时自动会
被释放,使用pthread_detach函数将线程设置为分离态。
创建一个线程后应回收其资源,但使用pthread_join函数会使调用者阻塞,故Linux提供了
线程分离函数:pthread_detach
可结合的(joinable)或者是分离的(detached),线程默认创建为可结合态。
如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会
释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join
之后这些资源才会被释放。
若是detached状态的线程,这些资源在线程函数退出时或pthread_exit时自动会
被释放,使用pthread_detach函数将线程设置为分离态。
创建一个线程后应回收其资源,但使用pthread_join函数会使调用者阻塞,故Linux提供了
线程分离函数:pthread_detach
线程退出
void pthread_exit(void *retval);
3 功能:退出正在执行的线程
3 功能:退出正在执行的线程
多任务互斥与同步
同步互斥概述
互斥:
一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共
资源。POSIX标准中进程和线程同步和互斥的方法,主要有信号量和互斥锁两种方式。
同步:
两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。
同步就是在互斥的基础上有顺序
一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共
资源。POSIX标准中进程和线程同步和互斥的方法,主要有信号量和互斥锁两种方式。
同步:
两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。
同步就是在互斥的基础上有顺序
互斥锁
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t
*mutexattr);
3 功能:初始化一个互斥锁
*mutexattr);
3 功能:初始化一个互斥锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
3 功能:对互斥锁上锁,若已经上锁,则调用者一直阻塞到互斥锁解锁
3 功能:对互斥锁上锁,若已经上锁,则调用者一直阻塞到互斥锁解锁
int pthread_mutex_unlock(pthread_mutex_t * mutex);
3 功能:对指定的互斥锁解锁
3 功能:对指定的互斥锁解锁
2 int pthread_mutex_destroy(pthread_mutex_t *mutex);
3 功能:销毁指定的一个互斥锁。
3 功能:销毁指定的一个互斥锁。
信号量
信号量又称之为PV操作,PV原语是对信号量的操作,一次P操作使信号量sem减
1,一次V操作使信号量sem加1,对于P操作,如果信号量的sem值为小于等于0,则P操
作就会阻塞,如果信号量的值大于0,才可以执行P操作进行减1
1,一次V操作使信号量sem加1,对于P操作,如果信号量的sem值为小于等于0,则P操
作就会阻塞,如果信号量的值大于0,才可以执行P操作进行减1
网络编程
tcp
服务器
创建套接字 socket()
将套接字与服务器网络信息结构体绑定 bind()
将套接字设置为监听状态 listen()
阻塞等待客户端的连接请求 accept()
进行通信 recv()/send()
关闭套接字 close()
将套接字与服务器网络信息结构体绑定 bind()
将套接字设置为监听状态 listen()
阻塞等待客户端的连接请求 accept()
进行通信 recv()/send()
关闭套接字 close()
客户端
创建套接字 socket()
发送客户端连接请求 connect()
进行通信 send()/recv()
关闭套接字 close()
发送客户端连接请求 connect()
进行通信 send()/recv()
关闭套接字 close()
udp
创建套接字socket
发送绑定接收函数
0 条评论
下一页