Linux进程
2022-05-06 10:23:41 12 举报
AI智能生成
登录查看完整内容
为你推荐
查看更多
Linux进程是指在Linux操作系统中运行的程序实例。每个进程都有自己的独立内存空间,可以与其他进程并行执行。进程之间通过系统调用进行通信和资源分配。Linux进程包括三个基本状态:运行、就绪和等待。运行状态是指进程正在CPU上执行;就绪状态是指进程已经准备好运行,但尚未获得CPU的执行权;等待状态是指进程正在等待某个事件(如I/O操作完成)而暂时停止执行。Linux进程还具有优先级,用于决定哪个进程优先获得CPU的执行权。此外,Linux进程还包括父进程和子进程的关系,子进程是父进程的副本,可以通过继承父进程的资源和环境来执行特定的任务。
作者其他创作
大纲/内容
文件描述符是非负整数。打开现存文件或新建文件时,系统(内核)会返回一个文件描述符。文件描述符用来指定已打开的文件。在系统调用(文件IO)中,文件描述符对文件起到标识作用,如果要操作文件,就是对文件描述符的操作
文件描述符
open函数
#include <unistd.h>2 int close(int fd);3 功能:关闭一个文件描述符4 参数:5 fd:指定文件的文件描述符,open函数的返回值6 返回值:7 成功:08 失败:‐1
close函数
write函数
read函数
文件io
程序是一些指令的有序集合,而进程是程序执行的过程,进程是程序的一次执行过程。进程的状态是变化的,其包括进程的创建、调度和消亡。只要程序运行,此时就是进程,程序每运行一次,就会创建一个进程
进程定义
进程控制块就是用于保存一个进程信息的结构体,又称之为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 返回给父进程,子进程不会创建
进程号及其创建
#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 成功:子进程的进程号。
进程等待
#include <unistd.h>2 void _exit(int status);3 功能:退出当前进程4 参数:5 status:退出状态,由父进程通过wait函数接收这个状态6 一般失败退出设置为非07 一般成功退出设置为08 返回值:9 无
exit和_exit函数的区别:exit为库函数,而_exit为系统调用exit会刷新缓冲区,但是_exit不会刷新缓冲区一般会使用exit
进程终止
fork和vfork函数的区别:vfork保证子进程先运行,在它调用exec或exit之后,父进程才可能被调度运行。vfork和fork一样都创建一个子进程,但它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit),于是也就不访问该地址空间。相反,在子进程中调用exec或exit之前,它在父进程的地址空间中运行,在exec之后子进程会有自己的进程空间
进程创建vfork
exec函数族
进程
信号是软件中断,它是在软件层次上对中断机制的一种模拟。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。
信号概念
kill函数
#include <unistd.h>2 unsigned int alarm(unsigned int seconds);3 功能:定时器,闹钟,当设定的时间到达时,会产生SIGALRM信号4 参数:5 seconds:设定的秒数6 返回值:7 如果alarm函数之前没有alarm设置,则返回08 如果有,则返回上一个alarm剩余的时间
alarm函数
raise函数
#include <stdlib.h>2 void abort(void);3 功能:向进程发送一个SIGABRT信号,默认情况下进程会退出。4 参数:无5 返回值:无
abort函数
#include <unistd.h>2 int pause(void);3 功能:阻塞等待一个信号的产生4 参数:5 无6 返回值:7 当有信号产生时,函数返回‐1
pause函数
signal函数
信号
管道(pipe)又称无名管道。无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符
无名管道概述
#include <unistd.h>2 int pipe(int pipefd[2]);3 功能:创建一个有名管道,返回两个文件描述符负责对管道进行读写操作4 参数:5 pipefd:int型数组的首地址,里面有两个元素6 pipefd[0] 负责对管道执行读操作7 pipefd[1] 负责对管道执行写操作8 返回值:9 成功:010 失败:‐1
无名管道创建pipe函数
/读写端都存在,只读不写15 //如果管道中有数据,会正常读取数据16 //如果管道中没有数据,则读操作会阻塞等待,直到有数据为止
/读写端都存在,只写不读15 //如果一直执行写操作,则无名管道对应的缓冲区会被写满,写满之后,write函数也会阻塞等待16 //默认无名管道的缓冲区64K字节
//关闭写文件描述符,只有读端18 //如果原本管道中有数据,则读操作正常读取数据19 //如果管道中没有数据,则read函数会返回0
//关闭写操作文件描述符,只有写端23 //如果关闭读端,一旦执行写操作,就会产生一个信号SIGPIPE(管道破裂),24 //这个信号的默认处理方式是退出进程
无名管道的读写规律
命名管道(FIFO)和管道(pipe)基本相同,但也有一些显著的不同,
有名管道概述
有名管道创建
/读写端都存在,只读不写21 //如果原本管道中有数据,则正常读取22 //如果管道中没有数据,则read函数会阻塞等待
//读写端都存在,只写不读21 //当有名管道的缓冲区写满后,write函数会发生阻塞22 //默认有名管道的缓冲区为64K字节
//在一个进程中,只有读端,没有写端21 //会在open函数的位置阻塞
//在一个进程中,只有写端,没有读端21 //会在open函数的位置阻塞
有名管道的读写规律
管道和有名管道
消息队列是消息的链表,存放在内存中,由内核维护
消息队列概述
消息队列函数
消息队列
共享内存允许两个或者多个进程共享给定的存储区域
共享内存概述
int shmdt(const void *shmaddr);4 功能:解除共享内存的映射
共享内存函数
共享内存
进程间通信
线程存在于进程中,共享进程的资源
线程概念
线程创建
线程等待
linux线程执行和windows不同,pthread有两种状态:可结合的(joinable)或者是分离的(detached),线程默认创建为可结合态。如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。若是detached状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放,使用pthread_detach函数将线程设置为分离态。创建一个线程后应回收其资源,但使用pthread_join函数会使调用者阻塞,故Linux提供了线程分离函数:pthread_detach
线程分离
void pthread_exit(void *retval);3 功能:退出正在执行的线程
线程退出
线程
同步互斥概述
int pthread_mutex_lock(pthread_mutex_t *mutex);3 功能:对互斥锁上锁,若已经上锁,则调用者一直阻塞到互斥锁解锁
int pthread_mutex_unlock(pthread_mutex_t * mutex);3 功能:对指定的互斥锁解锁
2 int pthread_mutex_destroy(pthread_mutex_t *mutex);3 功能:销毁指定的一个互斥锁。
互斥锁
信号量又称之为PV操作,PV原语是对信号量的操作,一次P操作使信号量sem减1,一次V操作使信号量sem加1,对于P操作,如果信号量的sem值为小于等于0,则P操作就会阻塞,如果信号量的值大于0,才可以执行P操作进行减1
信号量
多任务互斥与同步
创建套接字 socket()将套接字与服务器网络信息结构体绑定 bind()将套接字设置为监听状态 listen()阻塞等待客户端的连接请求 accept()进行通信 recv()/send()关闭套接字 close()
服务器
创建套接字 socket()发送客户端连接请求 connect()进行通信 send()/recv()关闭套接字 close()
客户端
tcp
创建套接字socket
发送绑定接收函数
udp
网络编程
Linux进程io与网络
0 条评论
回复 删除
下一页