linux系统编程
文章平均质量分 88
系统函数的简单描述
打的好啊__
打的好啊__
展开
-
信号阻塞/文件描述符阻塞
信号阻塞信号递达(Delivery):实际执行信号的处理动作。信号未决(pending):信号从产生到递达之间的状态。信号阻塞(block):产生信号,信号也不会被递达。被阻塞的信号产生时将保持在未决状态,信号被阻塞了就不被递达。未决信号集和阻塞信号集未决信号集: 信号产生后由于某些原因(主要是阻塞)不能抵达,这类信号的集合称之为未决信号集。在屏蔽解除前,信号一直处于未决状态;若是信号从阻塞信号集中解除阻塞,则该信号会被处理,并从未决原创 2021-01-27 15:50:57 · 365 阅读 · 0 评论 -
信号变量/信号量
信号变量条件本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。使用互斥量保护共享数据使用条件变量可以使线程阻塞, 等待某个条件的发生, 当条件满足的时候解除阻塞条件变量的两个动作:条件不满足,线程阻塞条件满足,通知阻塞的线程解除阻塞, 开始工作。条件变量相关函数pthread_cond_t cond;定义一个条件变量int pthread_cond_init(pthread_cond_t *restrict cond, const pth原创 2021-01-05 20:50:30 · 274 阅读 · 0 评论 -
互斥锁/读写锁
互斥锁Linux中提供一把互斥锁mutex(也称之为互斥量)。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。资源还是共享的,线程间也还是竞争的,但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。主要相关函数pthread_mutex_t 类型其本质是一个结构体,为简化理解,应用时可忽略其实现细节,简单当成整数看待。pthread_mutex_t mutex; 变量mutex只有两种取值1、0。pthread_mutex_init函数函数描述:原创 2021-01-05 17:58:02 · 276 阅读 · 2 评论 -
线程相关函数/设置线程分离属性
函数作用创建一个线程函数原型int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine) (void *),void *arg);返回值:成功:返回0失败:返回错误号函数参数:pthread_t:传出参数,保存系统为我们分配好的线程ID当前Linux中可理解为:typedef unsigned long int pthread_t。attr:通常传NULL,表示使用线原创 2021-01-02 16:05:56 · 409 阅读 · 0 评论 -
线程
线程定义线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。 –百科轻量级的进程(LWP: light weight process原创 2020-12-30 21:33:36 · 138 阅读 · 0 评论 -
sigaction()函数
函数说明注册一个信号处理函数函数原型:int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);函数参数signum:捕捉的信号act:传入参数,新的处理方式oldset:传出参数,旧的处理方式struct sigaction {void (*sa_handler)(int); // 信号处理函数void (*sa_sigaction)(int, siginfo_t *, void原创 2020-12-30 17:53:06 · 286 阅读 · 0 评论 -
守护进程/会话setsid()
守护进程Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字,如vsftpdLinux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现;ftp服务器;nfs服务器等。总结:守护进程的特点linux后台服务进程独立于控制终端周期性的执行某种任务不受用户登录和注销的影响一般采用以d结尾的名字,如vsftpd原创 2020-12-30 17:25:03 · 124 阅读 · 0 评论 -
信号集相关
信号集相关未决信号集和阻塞信号集的关系阻塞信号集是当前进程要阻塞的信号的集合,未决信号集是当前进程中还处于未决状态的信号的集合,这两个集合存储在内核的PCB中。以SIGINT为例说明信号未决信号集和阻塞信号集的关系:当进程收到一个SIGINT信号(信号编号为2),首先这个信号会保存在未决信号集合中,此时对应的2号编号的这个位置上置为1,表示处于未决状态;在这个信号需要被处理之前首先要在阻塞信号集中的编号为2的位置上去检查该值是否为1:如果为1,表示SIGNIT信号被当前进程阻塞了,这个信号暂时不原创 2020-12-28 17:15:20 · 71 阅读 · 0 评论 -
linux信号 小结
信号信号的机制进程A给进程B发送信号,进程B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕后再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为“软中断”。[注]:每个进程收到的信号,都是由内核负责发送的。信号的状态信号有三种状态:产生、未决和递达信号的产生按键产生,如:ctrl+c、ctrl+z、crtl+\系统调用产生,如:kill、raise、abort软件条件产生,如:定时器 alarm硬件转载 2020-12-28 11:38:57 · 91 阅读 · 0 评论 -
mmap()函数 (转载+整理)
内存映射区存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。从缓冲区中取数据,就相当于读文件中的相应字节;将数据写入缓冲区,则会将数据写入文件。这样,就可在不使用read和write函数的情况下,使用地址(指针)完成I/O操作。使用存储映射这种方法,首先应通知内核,将一个指定文件映射到存储区域中。这个映射工作可以通过mmap函数来实现。内存映射 mmap的理解mmap()函数函数作用建立存储映射区函数原型void *mmap(void *转载 2020-12-27 20:38:58 · 6383 阅读 · 0 评论 -
管道-pipe()函数使用
进程间通信linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。进程间通信的方式在进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道原创 2020-12-27 17:22:52 · 2427 阅读 · 2 评论 -
僵尸进程和孤儿进程
孤儿进程概念若子进程的父进程已经死掉,而子进程还存活着,这个进程就成了孤儿进程。为了保证每个进程都有一个父进程,孤儿进程会被init进程领养,init进程成为了孤儿进程的养父进程,当孤儿进程退出之后,由init进程完成对孤儿进程的回收。僵尸进程概念若子进程死了,父进程还活着, 但是父进程没有调用wait或waitpid函数完成对子进程的回收,则该子进程就成了僵尸进程。解决方案由于僵尸进程是一个已经死亡的进程,故不能使用kill命令将进程杀死;可以通过杀死父进程的方法消除僵尸进程:杀死其父原创 2020-12-27 09:46:15 · 136 阅读 · 0 评论 -
wait()/waitpid()函数使用
wait()函数作用阻塞并等待子进程退出回收子进程残留资源获取子进程结束状态(退出原因)函数原型pid_t wait(int *status);status参数:WIFEXITED(status):为非0 → 进程正常结束WEXITSTATUS(status):获取进程退出状态WIFSIGNALED(status):为非0 → 进程异常终止WTERMSIG(status): 取得进程终止的信号编号。返回值:成功:清理掉子进程ID;失败:-1(没有子进程)//父原创 2020-12-26 21:08:15 · 197 阅读 · 0 评论 -
exec()函数族
函数作用有的时候需要在一个进程里面执行其他的命令或者是用户自定义的应用程序,此时就用到了exec函数族当中的函数。使用方法 :一般都是在父进程里面调用fork创建处子进程,然后在子进程里面调用exec函数。execl()函数函数原型int execl(const char *path, const char arg, … / (char *) NULL */);参数介绍:path: 要执行的程序的绝对路径变参arg: 要执行的程序的需要的参数arg:占位,通常写应用程序的名字arg后原创 2020-12-26 20:21:51 · 1089 阅读 · 0 评论 -
fork()函数使用
fork()函数函数作用创建子进程函数原型pid_t fork(void);返回值调用成功:父进程返回子进程的PID,子进程返回0;调用失败:返回-1,设置errno;fork()函数总结fork()函数返回值父进程返回子进程的PID,是一个大于0的数;子进程返回0;特别注意不是一个fork()函数在一个进程中返回两个值,而是父子进程各自返回一个值。子进程创建成功后,代码执行的位置父进程执行到哪里,子进程从该位置开始执行。区分父子进程通过fork()函数的返回值;原创 2020-12-26 20:04:14 · 85 阅读 · 0 评论 -
fcntl()函数用法
fcntl()函数函数描述改变已经打开的文件的属性函数原型int fcntl(int fd, int cmd, … /* arg */ );若cmd为F_DUPFD, 复制文件描述符, 与dup相同若cmd为F_GETFL, 获取文件描述符的flag属性值若cmd为 F_SETFL, 设置文件描述符的flag属性函数返回值返回值取决于cmd;成功:1.若cmd为F_DUPFD, 返回一个新的文件描述符;2.若cmd为F_GETFL, 返回文件描述符的flags值;3.若cmd为原创 2020-12-26 17:54:21 · 166 阅读 · 0 评论 -
dup()/dup2()函数使用
dup()函数函数功能:复制文件描述符;函数原型int dup(int oldfd);oldfd --需要复制的文件描述符;函数返回值成功:返回最小且没有被占用的文件描述符;失败:返回-1,设置error;//测试dup函数复制文件描述符#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <unistd.h原创 2020-12-26 11:39:21 · 265 阅读 · 0 评论