
Linux/系统编程
文章平均质量分 60
Linux/系统调用
u013250861
这个作者很懒,什么都没留下…
展开
-
Linux网络编程(七)-第三方库-Libevent03:web服务器开发
我们要开发web服务器已经明确要使用http协议传送html文件,那么我们如何搭建我们的服务器呢?原创 2022-10-25 23:58:32 · 892 阅读 · 0 评论 -
Linux网络编程(四)-协议04:TCP/UDP【TCP:安全可靠、丢包重传、面向连接、电话模型】【UDP:不可靠(可设计应用层使其可靠)、丢包不重传、不面向连接、邮件模型、快、局域网内用丢包少】
Linux网络编程(四)-协议04:TCP/UDP【TCP:安全可靠、丢包重传、面向连接、电话模型】【UDP:不可靠(可设计应用层使其可靠)、丢包不重传、不面向连接、邮件模型、快、局域网内用丢包少】原创 2022-10-14 22:18:27 · 586 阅读 · 0 评论 -
Linux系统编程:系统调用【是一个内核与用户空间程序交互的接口(桥梁)】【操作系统提供给用户程序调用的一组“特殊”接口】【可以通过这组“特殊”接口来获得操作系统内核提供的服务】
系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。原创 2022-09-22 21:28:21 · 386 阅读 · 0 评论 -
Linux系统编程:Linux系统调用、C库函数调用的区别【Linux下对文件操作有两种方式:系统调用、库函数调用】【库函数由两类函数组成:①不需要调用系统接口;②需要调用系统接口】
当运行内核代码时,CPU工作在内核态,在系统调用发生前需要保存用户态的栈和内存环境,然后转入内核态工作。系统调用结束后,又要切换回用户态。这种环境的切换会消耗掉许多时间。库函数访问文件的时候根据需要,设置不同类型的缓冲区,从而减少了直接调用 IO 系统调用的次数,提高了访问效率。系统调用是需要时间的,程序中频繁的使用系统调用会降低程序的运行效率。原创 2022-09-22 23:30:56 · 288 阅读 · 0 评论 -
Linux系统编程-文件操作(一):文件描述符(Linux系统中,一切皆文件)【文件描述符是非负整数,是文件的标识】【打开现存文件或新建文件时,系统(内核)会返回一个文件描述符,用来指定已打开的文件】
打开现存文件或新建文件时,系统(内核)会返回一个文件描述符,文件描述符用来指定已打开的文件。这个文件描述符相当于这个已打开文件的标号,文件描述符是非负整数,是文件的标识,操作这个文件描述符相当于操作这个描述符所指定的文件。程序运行起来后(每个进程)都有一张文件描述符的表,标准输入、标准输出、标准错误输出设备文件被打开,对应的文件描述符 0、1、2 记录在表中。在程序运行起来后打开其他文件时,系统会返回文件描述符表中最小可用的文件描述符,并将此文件描述符记录在表中。在 Linux 的世界里,一切设备皆文件。原创 2022-09-22 23:28:33 · 295 阅读 · 0 评论 -
Linux系统编程-文件操作(二):文件IO函数【系统函数open/close/write/read/lseek】【不同于C语言的文件IO库函数fopen/fclose/fputc/fgetc】
从终端设备或网络读则不一定,如果从终端输入的数据没有换行符,调用read读终端设备就会阻塞,如果网络上没有接收到数据包,调用read从网络读就会阻塞,至于会阻塞多长时间也是不确定的,如果一直没有数据到达就一直阻塞在那里。需要说明的是,当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。读常规文件是不会阻塞的,不管读多少字节,read一定会在有限的时间内返回。可选项,和必选项按位或起来。原创 2022-09-22 21:42:28 · 258 阅读 · 0 评论 -
Linux系统编程-文件操作(三):文件相关函数【stat、access、chmod、chown、truncate、link、symlink、readlink、unlink】【对应Linux命令符】
st_mode(16位整数)参数说明文件类型判断应使用宏函数。原创 2022-09-22 22:45:35 · 339 阅读 · 0 评论 -
Linux系统编程-文件操作(四):目录相关函数【getcwd、chdir、opendir、closedir、readdir】
【代码】Linux系统编程-目录操作:目录相关函数【getcwd、chdir、opendir、closedir、readdir】原创 2022-09-23 00:04:31 · 216 阅读 · 0 评论 -
Linux系统编程-进程(一):进程概述【进程、程序 】【并行、并发】【进程控制块PCB】【内存泄露检测:valgrind】【GDB调试】
在每个进程退出的时候,内核释放该进程所有的资源、包括打开的文件、占用的内存等。但是仍然为其保留一定的信息,这些信息主要主要指进程控制块PCB的信息(包括进程号、退出状态、运行时间等)。父进程可以通过调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。wait() 和 waitpid() 函数的功能一样,区别在于,wait() 函数会阻塞,waitpid() 可以设置不阻塞,waitpid() 还可以指定等待哪个子进程结束。原创 2022-09-23 08:23:37 · 465 阅读 · 0 评论 -
Linux系统编程-进程(二):进程的创建、父子进程【fork():从一个已存在的进程中创建的新进程称为子进程,原进程称为父进程】【使用 fork() 得到的子进程是父进程的复制品(深拷贝)】
系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成进程树结构模型。从运行结果,我们可以看出,fork() 之后的打印函数打印了两次,而且打印了两个进程号,这说明,fork() 之后确实创建了一个新的进程,新进程为子进程,原来的进程为父进程。原创 2022-09-27 04:17:59 · 1704 阅读 · 0 评论 -
Linux系统编程-进程(三):进程号、获取进程号函数【getpid():获取本进程号(PID)】【getppid():获取父进程号(PPID)】【getpgid():获取进程组号(PGID)】
每个进程都由一个进程号来标识,其类型为 pid_t(整型),进程号的范围:0~32767。进程号总是唯一的,但进程号可以重用。当一个进程终止后,其进程号就可以再次使用。接下来,再给大家介绍三个不同的进程号。:标识进程的一个非负整型数。:任何进程( 除 init 进程)都是由另一个进程创建,该进程称为被创建进程的父进程,对应的进程号称为父进程号(PPID)。如,A 进程创建了 B 进程,A 的进程号就是 B 进程的父进程号。:进程组是一个或多个进程的集合。原创 2022-09-27 04:12:48 · 4092 阅读 · 0 评论 -
Linux系统编程-进程(四)-进程间通讯-同主机-方式01:无名管道、有名管道(同主机进程间通信)【进程是独立的资源分配单元,不同进程的资源独立无关联】
但是,进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要进程间通信( IPC:Inter Processes Communication )。进程是一个独立的资源分配单元,不同进程(这里所说的进程通常指的是用户进程)之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源。原创 2022-09-23 08:34:26 · 196 阅读 · 0 评论 -
Linux系统编程-进程(四)-进程间通讯-同主机-方式02:共享内存、共享存储映射(mmap函数)
存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件。这样,就可在不适用read和write函数的情况下,使用地址(指针)完成I/O操作。共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式, 因为进程可以直接读写内存,而不需要任何数据的拷贝。原创 2022-09-23 22:27:38 · 197 阅读 · 0 评论 -
Linux系统编程-进程(四)-进程间通讯-同主机-方式03:信号(同主机进程间通信)【Linux 进程间通信的最古老的方式】【简单、不能携带大量信息、满足某个特设条件才发送】
我们在终端上敲“Ctrl+c”,就产生一个“中断”,相当于产生一个信号,接着就会处理这么一个“中断任务”(默认的处理方式为中断当前进程)。“中断”在我们生活中经常遇到,譬如,我正在房间里打游戏,突然送快递的来了,把正在玩游戏的我给“中断”了,我去签收快递( 处理中断 ),处理完成后,再继续玩我的游戏。一个完整的信号周期包括三个部分:信号的产生,信号在进程中的注册,信号在进程中的注销,执行信号处理函数。注意:这里信号的产生,注册,注销时信号的内部机制,而不是信号的函数实现。原创 2022-09-23 22:20:44 · 228 阅读 · 0 评论 -
Linux系统编程-进程(四)-进程间通讯-同主机-方式04:消息队列
Linux系统编程-进程(四)-进程间通讯方式04:消息队列。原创 2022-10-04 14:06:29 · 200 阅读 · 0 评论 -
Linux系统编程-进程(三):守护进程【Daemon Process(精灵进程)】【Linux 中的后台服务进程,独立于控制终端】
守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。原创 2022-09-23 23:07:45 · 454 阅读 · 0 评论 -
Linux系统编程-进程(四):进程资源回收(等待子进程退出函数)【wait()/waitpid()】
在每个进程退出的时候,内核释放该进程所有的资源、包括打开的文件、占用的内存等。但是仍然为其保留一定的信息,这些信息主要主要指进程控制块PCB的信息(包括进程号、退出状态、运行时间等)。父进程可以通过调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。wait() 和 waitpid() 函数的功能一样,区别在于,wait() 函数会阻塞,waitpid() 可以设置不阻塞,waitpid() 还可以指定等待哪个子进程结束。原创 2022-09-27 06:32:42 · 770 阅读 · 0 评论 -
Linux系统编程-进程(五):进程的状态(运行态,就绪态,阻塞态)、进程相关命令(ps、top、htop、kill、killall)
进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中,进程状态分为三个基本状态,即。在五态模型中,进程分为。进程正在被CPU执行。当一个进程刚被创建时会处于TASK_RUNNABLE,表示己经准备就绪,正等待被调度。进程正在睡眠(也就是说它被阻塞)等待某些条件的达成。一旦这些条件达成,内核就会把进程状态设置为运行。处于,(变为TASK_ZOMBIE状态),并不会从TASK_INTERRUPTIBLE状态直接退出。处于等待中的进程,待资源满足时被唤醒,。原创 2022-09-27 04:39:03 · 1825 阅读 · 0 评论 -
Linux系统编程-进程(六):进程退出函数【exit()、_exit()】【exit() 和 _exit() 功能和用法是一样的;区别:_exit()属于标准库函数,exit()属于系统调用函数】
exit() 函数功能和用法是一样的,无非时所包含的头文件不一样,还有的区别就是:exit()属于标准库函数,exit()属于系统调用函数。exit() 和 _原创 2022-09-27 04:29:10 · 256 阅读 · 0 评论 -
Linux系统编程-进程(七):进程替换
进程调用一种 exec 函数时,该进程完全由新程序替换,而新程序则从其 main 函数开始执行。exec 函数族与一般的函数不同,exec 函数族中的函数执行成功后不会返回,而且,exec 函数族下面的代码执行不到。但是,如果我们本来就运行着一个程序(进程),我们如何在这个进程内部启动一个外部程序,由内核将这个外部程序读入内存,使其执行起来成为一个进程呢?exec 函数族的作用是根据指定的文件名或目录名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。原创 2022-09-27 04:20:36 · 205 阅读 · 0 评论 -
Linux系统编程-进程(八):孤儿进程、僵尸进程
父进程运行结束,但子进程还在运行(未运行结束)的子进程就称为孤儿进程(Orphan Process)。每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为 init ,而 init 进程会循环地 wait() 它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init 进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。原创 2022-09-27 04:40:43 · 369 阅读 · 0 评论 -
Linux系统编程-线程(一):概述【进程是CPU分配资源的最小单位、线程是操作系统调度执行的最小单位】【进程是一个资源管家负责从系统要资源,线程是干活的苦力;一个进程完成一项工作,最少需要一个线程】
Linux下线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问题。如我们对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数。{//线程的分离状态//线程调度策略//线程的调度参数//线程的继承性int scope;//线程的作用域//线程栈末尾的警戒缓冲区大小//线程的栈设置//线程栈的位置//线程栈的大小1) 线程分离状态。原创 2022-09-24 00:37:50 · 2012 阅读 · 0 评论 -
Linux系统编程-线程(一):线程号(线程号用pthread_t数据类型表示)【Linux使用无符号长整数,有的系统使用结构体,所以比较线程号是否相等时用pthread_equal()函数进行比较】
就像每个进程都有一个进程号一样,每个线程也有一个线程号。进程号在整个系统中是唯一的,但线程号不同,线程号只在它所属的进程环境中有效。进程号用 pid_t 数据类型表示线程号则用 pthread_t 数据类型来表示。原创 2022-09-27 04:47:39 · 1540 阅读 · 0 评论 -
Linux系统编程-线程(二):线程常用操作(pthread_*)【创建子线程(父子线程关系)、线程资源回收、分离、退出、取消】
但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。2) 如果thread线程被别的线程调用pthread_cancel异常终止掉,retval所指向的单元里存放的是常数PTHREAD_CANCELED。3) 如果thread线程是自己调用pthread_exit终止的,retval所指向的单元存放的是传给pthread_exit的参数。1) 如果thread线程通过return返回,retval所指向的单元里存放的是thread线程函数的返回值。原创 2022-09-27 05:48:44 · 1682 阅读 · 0 评论 -
Linux系统编程-线程(一):线程属性
Linux下线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问题。如我们对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数。属性值不能直接设置,须使用相关函数进行操作,初始化的函数为pthread_attr_init,这个函数必须在pthread_create函数之前调用。之后须用pthread_attr_destroy函数来释放资源。原创 2022-09-27 04:50:58 · 745 阅读 · 0 评论 -
Linux系统编程-线程(二)-线程同步01:互斥锁
而在线程里也有这么一把锁:互斥锁(mutex),也叫互斥量,互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只有两种状态,即加锁( lock )和解锁( unlock )。互斥锁的操作流程如下:1)在访问共享资源后临界区域前,对互斥锁进行加锁。2)在访问完成后释放互斥锁导上的锁。3)对互斥锁进行加锁后,任何其他试图再次对互斥锁加锁的线程将会被阻塞,直到锁被释放。互斥锁的数据类型是: pthread_mutex_t。原创 2022-09-24 00:53:54 · 515 阅读 · 0 评论 -
Linux系统编程-线程(二)-线程同步02:死锁
所有进程开始前,必须一次性地申请所需的所有资源,这样运行期间就不会再提出资源要求,破坏了请求条件,即使有一种资源不能满足需求,也不会给它分配正在空闲的资源,这样它就没有资源,就破坏了保持条件,从而预防死锁的发生。有p1,p2,p3三个进程,p1向p2发送消息并接受p3发送的消息,p2向p3发送消息并接受p1的消息,p3向p1发送消息并接受p2的消息,如果设置是先接到消息后发送消息,则所有的消息都不能发送,这就造成死锁。某资源只能被一个进程使用,其他进程请求该资源时,只能等待,直到资源使用完毕后释放资源。原创 2022-09-24 01:06:44 · 162 阅读 · 0 评论 -
Linux系统编程-线程(二)-线程同步03:读写锁
当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住。但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读访问共享资源了,但是实际上多个线程同时读访问共享资源并不会导致问题。在对数据的读写操作中,更多的是读操作,写操作较少,例如对数据库数据的读写应用。为了满足当前能够允许多个读出,但只允许一个写入的需求,线程提供了来实现。原创 2022-09-24 00:53:06 · 174 阅读 · 0 评论 -
Linux系统编程-线程(二)-线程同步04:条件变量【相较于互斥锁(mutex)而言,条件变量可以减少竞争】
与互斥锁不同,条件变量是用来等待而不是用来上锁的,!条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。条件变量的类型: pthread_cond_t。原创 2022-09-24 00:58:46 · 178 阅读 · 0 评论 -
Linux系统编程-线程(二)-线程同步05:信号量
信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 0 时,则可以访问,否则将阻塞。PV 原语是对信号量的操作,一次 P 操作使信号量减1,一次 V 操作使信号量加1。信号量主要用于进程或线程间的同步和互斥这两种典型情况。信号量数据类型为:sem_t。原创 2022-09-24 01:02:11 · 227 阅读 · 0 评论 -
Linux系统编程-基础概念:终端、进程组、会话
进程组,也称之为作业。BSD于1980年前后向Unix中增加的一个新特性。代表一个或多个进程的集合。每个进程都属于一个进程组。在waitpid函数和kill函数的参数中都曾使用到。操作系统设计的进程组的概念,是为了简化对多个进程的管理。当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程组ID为第一个进程ID(组长进程)。原创 2022-09-23 23:03:47 · 442 阅读 · 0 评论 -
Linux系统编程:错误处理函数【errno是记录系统的最后一次错误代码】【错误代码是一个int型的值,在errno.h中定义】
errno 是记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义。查看错误代码errno是调试程序的一个重要方法。当Linux C api函数发生异常时,一般会将errno全局变量赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。原创 2022-09-22 23:37:00 · 392 阅读 · 0 评论 -
Linux系统编程:阻塞、非阻塞【读常规文件是不会阻塞】【从网络或终端读/写则可能会阻塞:①调用read从网络或终端读数据时,如果网络上没有接收到数据包或者终端输入数据后没按换行符,就会阻塞(等待)】
从终端设备或网络读则不一定,如果从终端输入的数据没有换行符,调用read读终端设备就会阻塞,如果网络上没有接收到数据包,调用read从网络读就会阻塞,至于会阻塞多长时间也是不确定的,如果一直没有数据到达就一直阻塞在那里。【注意】阻塞与非阻塞是对于文件而言的,而不是指read、write等的属性。读常规文件是不会阻塞的,不管读多少字节,read一定会在有限的时间内返回。同样,写常规文件是不会阻塞的,而向终端设备或网络写则不一定。原创 2022-09-22 22:15:19 · 699 阅读 · 0 评论 -
Linux系统编程:虚拟地址空间
在进程里平时所说的指针变量,保存的就是虚拟地址。当应用程序使用虚拟地址访问内存时,处理器(CPU)会将其转化成物理地址(MMU)。每个进程都会分配虚拟地址空间,在32位机器上,该地址空间为4G。MMU:将虚拟的地址转化为物理地址。原创 2022-09-22 23:32:06 · 884 阅读 · 0 评论 -
Linux系统编程:时间相关函数
【代码】Linux系统编程:时间相关函数。原创 2022-09-23 00:06:21 · 273 阅读 · 0 评论 -
Linux系统编程-网络服务器:高并发(多线程、多进程能实现并发,但是实现不了高并发)【处理一百以内的请求数并发,可以尝试使用多线程实现】
多线程、多进程能实现并发,但是实现不了高并发。一个程序能同时开辟的线程数量依赖于自身硬件资源,比如一个线程占用10M的栈区,如果来一个用户就开一个10M的栈区空间,则能实现的并发数量很有限。原创 2022-10-01 23:20:07 · 148 阅读 · 0 评论