Linux系统编程
文章平均质量分 56
Linux系统编程
liufeng2023
日拱一卒
展开
-
327-writev和readv函数
它们只需一次系统调用就可以实现在文件和进程的多个缓冲区之间传送数据,免除了多次系统调用或复制数据的开销。参数fildes是文件描述符iov是一个结构数组,它的每个元素指明存储器中的一个缓冲区。结构类型iovec有下述成员,分别给出缓冲区的起始地址和字节数:参数iovcnt指出数组iov的元素个数,元素个数至多不超过IOV_MAX。Linux中定义IOV_MAX的值为1024。下图说明了参数iovcnt、iov及其所指数组与这两个函数的关系:1、writev()有了这两个函数,当想要集中写原创 2022-06-06 14:31:01 · 215 阅读 · 0 评论 -
323-netstat命令详解
命令参数:命令使用举例 :原创 2022-06-05 11:27:11 · 199 阅读 · 0 评论 -
322-ps -ef | grep详解
以下这条命令是检查进程是否存在:UID : 程序被该 UID 所拥有PID : 就是这个程序的 IDPPID : 则是其上级父程序的IDC : CPU使用的资源百分比STIME : 系统启动时间TTY : 登入者的终端机位置TIME : 使用掉的CPU时间。CMD : 所下达的是什么指令...原创 2022-06-05 11:11:06 · 671 阅读 · 0 评论 -
166-网络编程:epoll
1.4 epoll1.4.1、epoll API介绍首先调用epoll_create()创建一个epoll实例----在内核区,是一个eventpoll结构体类型;返回值是一个文件描述符,可以通过这个文件描述符操作内核中这块内存(通过epoll提供的API进行操作)生成的eventpoll内部,有两个类型:rb_root,红黑树结构;–记录需要检测的文件描述符list_head,链表 --要求检测的文件描述符中,哪些文件描述符是有数据的 优点: 与select和pol原创 2022-05-07 23:00:56 · 775 阅读 · 0 评论 -
155-网络编程:本地套接字
本地套接字本地套接字的作用: 本地的进程间通信可以实现 有关系的进程间的通信 和 没有关系的进程间的通信本地套接字实现流程和网络套接字类似,一般采用TCP的通信流程。// 头文件: sys/un.h#define UNIX_PATH_MAX 108struct sockaddr_un { sa_family_t sun_family; // 地址族协议 af_local char sun_path[UNIX_PATH_MAX]; // 套接字文件的路径, 这是一个伪文件, 大小原创 2022-05-05 22:16:54 · 1071 阅读 · 0 评论 -
154-网络编程:组播
组播 单播地址标识单个 IP 接口,广播地址标识某个子网的所有 IP 接口,多播地址标识一组 IP 接口。单播和广播是寻址方案的两个极端(要么单个要么全部),多播则意在两者之间提供一种折中方案。多播数据报只应该由对它感兴趣的接口接收,也就是说由运行相应多播会话应用系统的主机上的接口接收。另外,广播一般局限于局域网内使用,而多播则既可以用于局域网,也可以跨广域网使用。组播既可以用于局域网,也可以用于广域网客户端需要加入多播组,才能接收到多播的数据组播地址: IP 多播通信必须依赖于 IP原创 2022-05-05 22:14:25 · 360 阅读 · 0 评论 -
141-网络编程:UDP通信
UDP通信UDP服务端创建的socket是直接用来通信的套接字,没有类似TCP一样创建一个监听的socket。UDP相关函数:#include <sys/types.h>#include <sys/socket.h>注意:send和recv用于TCP; sendto和recvfrom用于UDP。ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr原创 2022-05-03 20:41:43 · 325 阅读 · 0 评论 -
140-网络编程:poll
1.3 poll1.3.1、poll API介绍poll将需要检测的文件描述符封装成一个结构体;#include <poll.h>struct pollfd { int fd; /* 委托内核检测的文件描述符 */ short events; /* 委托内核检测文件描述符的什么事件 */ short revents; /* 文件描述符实际发生的事件 */ --实际发生设么时间,内核就是通过这个给我们返回的};struct pollfd myfd;myfd.fd =原创 2022-05-03 20:40:04 · 451 阅读 · 0 评论 -
139-网络编程:select
1.2 select1.2.1、select API介绍主旨思想:首先要构造一个关于文件描述符的列表,将要监听的文件描述符添加到该列表中。调用一个系统函数,监听该列表中的文件描述符,直到这些描述符中的一个或者多个进行I/O操作时,该函数才返回。a. 这个函数是阻塞b. 函数对文件描述符的检测的操作是由内核完成的在返回时,它会告诉进程有多少(哪些)描述符要进行I/O操作。// sizeof(fd_set) = 128字节 1024位, 每一个标志位对应一个文件描述符#inc原创 2022-05-03 20:38:20 · 331 阅读 · 1 评论 -
131-网络编程: I/O多路复用(I/O多路转接)
1. I/O多路复用(I/O多路转接)I/O 多路复用使得程序能同时监听多个文件描述符,能够提高程序的性能,Linux 下实现 I/O 多路复用的系统调用主要有 select、poll 和 epoll。输入: 将程序写到内存中输出: 将内存中的数据读到文件中socket通信时,其本身是一个文件描述符,对应内核中的一块缓冲区(里面有读缓冲区和写缓冲区),通过缓冲区进行数据的交换。要操作IO,其实就是看文件描述符的读写缓冲区中是否有数据;1.1 IO模型1.1.1、阻塞等待TCP在进行通信原创 2022-05-02 13:47:50 · 207 阅读 · 0 评论 -
130-网络编程:端口复用
4、端口复用fgets(sendBuf, sizeof(sendBuf), stdin); -默认是阻塞的#include <stdio.h>#include <arpa/inet.h>#include <stdlib.h>#include <unistd.h>#include <string.h>int main() { // 创建socket int fd = socket(PF_INET, SOCK_ST原创 2022-05-02 13:34:58 · 811 阅读 · 0 评论 -
129-网络编程:TCP通信的并发(多线程实现并发服务器)
3.2 多线程实现并发服务器#include <stdio.h>#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <pthread.h>//将线程处理函数需要的参数信息,全部封装到结构体中struct sockInfo { int fd; // 通信的文件描述符 struct s原创 2022-05-02 13:30:00 · 662 阅读 · 0 评论 -
128-网络编程:TCP通信的并发(多进程实现并发服务器)
3、TCP通信的并发(多进程实现并发服务器)3.1 多进程实现并发服务器要实现TCP通信服务器处理并发任务,使用多线程或者多进程来解决。思路: 1. 一个父进程,多个子进程 2. 父进程负责等待并接受客户端连接 3. 子进程: 完成通信,接受一个客户端连接,就创建一个子进程用于通信。#include <stdio.h>#include <arpa/inet.h>#include <unistd.h>#include <stdlib.原创 2022-05-02 13:28:57 · 2712 阅读 · 3 评论 -
123-网络编程:TCP通信实现(服务器端 & 客户端)
1、TCP通信实现(服务器端)// TCP 通信的服务器端#include <stdio.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <stdlib.h>int main() { // 1.创建socket(用于监听的套接字) int lfd = socket(AF_INET, SOCK_STREAM, 0);原创 2022-05-01 16:15:40 · 823 阅读 · 0 评论 -
122-网络编程:Socket通信基础
资源链接:目录:原创 2022-05-01 16:07:46 · 155 阅读 · 0 评论 -
121-多线程开发:生产者消费者模型、条件变量、信号量
12、生产者消费者模型通知机制(目前还实现不了,条件变量和信号量)生产者满了,会阻塞在那里,通知消费者消费;消费者消费完之后,消费者也会阻塞在那里;数据同步 和 数据满了或者没有数据的相互通知机制/* 生产者消费者模型(粗略的版本)*/#include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <unistd.h>//定义链表节点struct Node{原创 2022-05-01 15:23:18 · 335 阅读 · 0 评论 -
115-多线程开发:死锁、读写锁
10、死锁 有时,一个线程需要同时访问两个或更多不同的共享资源,而每个资源又都由不同的互斥量管理。当超过一个线程加锁同一组互斥量时,就有可能发生死锁; 两个或两个以上的进程在执行过程中,因争夺共享资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。死锁的几种场景:忘记释放锁重复加锁(重复加相同的锁)多线程多锁,抢占锁资源//多线程多锁,抢占锁资源#include <stdio.h>#include <pth原创 2022-04-30 11:18:29 · 259 阅读 · 0 评论 -
114-多线程开发:线程同步、互斥量
8、线程同步/* 使用多线程实现买票的案例。 有3个窗口,一共是100张票。*/#include <stdio.h>#include <pthread.h>#include <unistd.h>// 全局变量,所有的线程都共享这一份资源。int tickets = 100;void * sellticket(void * arg) { // 卖票 while(tickets > 0) { usle原创 2022-04-30 11:15:10 · 140 阅读 · 0 评论 -
113-多线程开发:创建线程-pthread_create、终止线程-pthread_exit、连接已终止的线程-pthread_join、线程分离-pthread_detach、线程取消、线程属性
2、创建线程-pthread_create()/* 一般情况下,main函数所在的线程我们称之为主线程(main线程),其余创建的线程 称之为子线程。 程序中默认只有一个进程,fork()函数调用,2进行 程序中默认只有一个线程,pthread_create()函数调用,2个线程。 #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *a原创 2022-04-30 11:04:22 · 681 阅读 · 0 评论 -
111-多线程开发:线程概述
1、线程概述1.1 线程与进程(process)类似,线程(thread)是允许应用程序并发执行多个任务的一种机制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且共享同一份全局内存区域,其中包括初始化数据段、未初始化数据段, 以及堆内存段。(传统意义上的UNIX进程只是多线程程序的一个特例,该进程只包含一个线程)进程是CPU分配资源的最小单位,线程是操作系统调度执行的最小单位。线程是轻量级的进程(LWP: Light weight Process) ,在Linux环境原创 2022-04-30 00:44:47 · 88 阅读 · 0 评论 -
107-多进程开发:守护进程
15、守护进程15.1 守护进程定义 守护进程(Daemon Process) ,也就是通常说的 Daemon进程(精灵进程),是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d 结尾的名字。特点:生命周期很长,守护进程会在系统启动的时候被创建并一直运行直至系统被关闭。它在后台运行并且不拥有控制终端。没有控制终端确保了内核永远不会为守护进程自动生成任何控制信号以及终端相关的信号(如SIGINT、SIGQUI原创 2022-04-29 10:07:03 · 192 阅读 · 0 评论 -
106-多进程开发:终端、进程组、会话
14、终端、进程组、会话14.1 终端在UNIX系统中,用户通过终端登录系统后得到一个shell进程,这个终端成为shell 进程的控制终端(Controlling Terminal),进程中,控制终端是保存在PCB中的信息,而fork()会复制PCB 中的信息,因此由shell 进程启动的其它进程的控制终端也是这个终端。默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准错误输出写也就是输出到显示器上。在原创 2022-04-29 10:06:34 · 279 阅读 · 0 评论 -
105-多进程开发:进程间通信(共享内存)
13、共享内存共享内存和内存映射都是直接操作内存的,效率较高;共享内存的效率高于内存映射。共享内存相关的函数#include <sys/ipc.h>#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg); - 功能:创建一个新的共享内存段,或者获取一个既有的共享内存段的标识。 新创建的内存段中的数据都会被初始化为0 - 参数: - key : ke原创 2022-04-29 10:03:50 · 201 阅读 · 0 评论 -
104-多进程开发:进程间通信(信号)
12、信号12.1 信号的概念 信号是 Linux进程间通信的最古老的方式之一,是事件发生时对进程的通知机制,有时也称之为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。发往进程的诸多信号,通常都是源于内核。引发内核为进程产生信号的各类事件如下:对于前台进程,用户可以通过输入特殊的终端字符来给它发送信号。比如输入Ctrl+C通常会给进程发送一个中断信号。硬件发生异常,即硬件检测到一个错误原创 2022-04-29 10:00:16 · 526 阅读 · 0 评论 -
103-多进程开发:进程间通信(匿名管道、有名管道、内存映射)
8、进程间通信简介8.1 进程间通讯概念 进程是一个独立的资源分配单元,不同进程(这里所说的进程通常指的是用户进程)之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源。 但是,进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要进程间通信(IPC: Inter Processes Communication )。进程间通信的目的:数据传输: 一个进程需要将它的数据发送给另一个进程。通知事件: 一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某原创 2022-04-29 09:47:31 · 488 阅读 · 0 评论 -
97-多进程开发:进程回收
7、进程回收在每个进程退出的时候,内核释放该进程所有的资源、包括打开的文件、占用的内存等。但是仍然为其保留一定的信息,这些信息主要主要指进程控制块PCB的信息(包括进程号、退出状态、运行时间等)。父进程可以通过调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。wait ()和waitpid ()函数的功能一样,区别在于:wait()函数会阻塞,waitpid ()可以设置不阻塞(waitpid默认是阻塞的);waitpid()还可以指定等待哪个子进程结束;注意: 一次w原创 2022-04-28 10:10:44 · 339 阅读 · 0 评论 -
96-多进程开发:进程控制
6、进程控制调用fork函数会创建一个子进程,创建子进程时,并没有将父进程的虚拟地址空间完全拷贝进来;一开始子进程和父进程是共享虚拟地址空间的,主要共享用户区的数据,内核区的数据还是不一样的,进程id,父进程id都是不同的;(读时共享,写时复制)6.1 进程退出状态参数status,会将退出的信息传出;在父子进程中,子进程退出了,父进程就会的到子进程的退出状态status;子进程的回收是通过父进程来回收的;子进程退出后,能释放自己用户区的数据,内核区的数据自己是不能释放的。父进程需要回收子进原创 2022-04-28 10:02:08 · 137 阅读 · 0 评论 -
95-多进程开发:exec函数族
5、exec函数族函数族: 一系列功能相似或相同的函数。exec函数族作用: 根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。exec函数族的函数执行成功后不会返回;因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程ID 等一些表面上的信息仍保持原样只有调用失败了,它们才会返回 -1,从原程序的调用点接着往下执行。exec函数族作用图解:想在当前进程中运行a.out这个可执行程序;会将进程中的用户区原创 2022-04-28 09:52:30 · 157 阅读 · 0 评论 -
89-多进程开发:GDB多进程调试
4、GDB多进程调试使用GDB 调试的时候,GDB默认只能跟踪一个进程;可以在 fork 函数调用之前,通过指令设置GDB 调试工具跟踪父进程或者是跟踪子进程,默认跟踪父进程。测试程序:hello.c:#include <stdio.h>#include <unistd.h>int main() { printf("begin\n"); if(fork() > 0) { printf("我是父进程:pid = %d, ppid原创 2022-04-27 11:06:53 · 2426 阅读 · 0 评论 -
88-多进程开发:进程创建
3、进程创建/* #include <sys/types.h> #include <unistd.h> pid_t fork(void); 函数的作用:用于创建子进程。 返回值: fork()的返回值会返回两次。一次是在父进程中,一次是在子进程中。 --在父进程中返回创建的子进程的ID, --在子进程中返回0 如何区分父进程和子进程原创 2022-04-27 10:06:31 · 433 阅读 · 0 评论 -
87-多进程开发:进程状态转换
2、进程状态转换进程状态: 反应进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。2.1 三态模型三态模型: 就绪态、运行态、阻塞态运行态: 进程占有处理器正在运行。就绪态: 进程具备运行条件,等待系统分配处理器以便运行。当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列**阻塞态:**又称为等待 (wait) 态或睡眠 (sleep) 态,指进程 不具备运行条件,正在等待某原创 2022-04-27 10:02:30 · 266 阅读 · 0 评论 -
80-多进程开发:进程概述
1、进程概述1.1 程序程序是包含一系列信息的文件,这些信息描述了如何在运行时创建一个进程:二进制格式标识: 每个程序文件都包含用于描述可执行文件格式的元信息。内核利用此信息来解释文件中的其他信息。(ELF可执行连接格式)机器语言指令: 对程序算法进行编码。程序入口地址: 标识程序开始执行时的起始指令位置。数据: 程序文件包含的变量初始值和程序使用的字面量值(比如字符串)。符号表及重定位表: 描述程序中函数和变量的位置及名称。这些表格有多重用途,其中包括调试和运行时的符号解析(动态链接)。原创 2022-04-26 09:14:11 · 160 阅读 · 0 评论 -
79-文件IO:dup、dup2、fcntl函数
1、dup、dup2函数1.1 dup/* #include <unistd.h> int dup(int oldfd); 作用:复制一个新的文件描述符 fd=3, int fd1 = dup(fd), fd指向的是a.txt, fd1也是指向a.txt 从空闲的文件描述符表中找一个最小的,作为新的拷贝的文件描述符*/#include <unistd.h>#include <std原创 2022-04-26 09:08:20 · 155 阅读 · 0 评论 -
78-文件IO:目录操作函数(mkdir、rmdir、rename、chdir、getcwd) & 目录遍历函数(opendir、readdir、closedir)
1、目录操作函数mkdir:创建目录rmdir:删除目录rename:对目录重命名chdir:修改进程的工作目录getcwd:获取当前目录路径1.1 mkdir/* #include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mode_t mode); 作用:创建一个目录 参数: pathnam原创 2022-04-26 09:06:06 · 508 阅读 · 0 评论 -
73-文件IO:文件操作函数access、chomd、chown、truncate
1、文件操作函数access: 判断文件是否有某个权限,判断文件是否存在;chmod: 修改文件权限chown: 修改文件所在组truncate: 缩减/扩展文件的大小;1.1 access/* #include <unistd.h> int access(const char *pathname, int mode); 作用:判断某个文件是否有某个权限,或者判断文件是否存在 参数: - pathname: 判原创 2022-04-25 10:17:48 · 313 阅读 · 0 评论 -
72-文件IO:目录项和inode & stat、lstat函数
1、目录项和inode一个文件主要由两部分组成:dentry,目录项,包括文件名和inode号inode:本质结构体;存储文件的属性信息,如:权限、类型、大小、时间、用户、盘快位置()…也叫做文件属性管理结构,大多数的inode都存储在磁盘上。(少量常用、近期使用的inode会被缓存到内存中)给文件创建硬链接:inode是一样的,但是目录项是不一样的删除文件:就是删除inode,去掉一个目录项,但是数据其实还是在硬盘上,以后会覆盖掉。2、stat、lstat函数查看文件信息:原创 2022-04-25 10:05:54 · 352 阅读 · 1 评论 -
71-文件IO:read、write函数和lseek函数
1、read、write函数/* #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 参数: - fd:文件描述符,open得到的,通过这个文件描述符操作某个文件 - buf:需要读取数据存放的地方,数组的地址(传出参数) - count:指定的数组的大小 返回值:原创 2022-04-25 10:00:53 · 346 阅读 · 0 评论 -
70-文件IO:open函数
1、open函数1.1 open打开文件打开模式含义O_CREAT必要时创建文件O_TRUNC删除全部现有数据O_APPEND维持现有数据,保存到其后面O_RDONLY只读打开O_WRONLY只写打开O_RDWR读写打开/* #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> // 打开一个已原创 2022-04-25 09:58:45 · 372 阅读 · 0 评论 -
69-文件IO:虚拟地址空间与文件描述符
1、虚拟地址空间虚拟地址空间是不存在的,是程序员想象出来的。虚拟地址空间大小:32位的计算机:2^3264位的计算机:2^642、文件描述符文件描述符在内核区,由PCB进程控制块进行控制,其中有文件描述符表文件描述符表:默认大小1024;前三个默认被使用:标准输入0-STDIN_FILENO,标准输出1-STDOUT_FILENO,标准错误2-STDERR_FILENO;和当前终端绑定;打开新文件,占用的文件描述符是当前文件描述表中的最小文件描述符(内核维护)原创 2022-04-25 09:55:11 · 190 阅读 · 0 评论 -
68-文件I/O:标准C库IO函数和Linux系统IO函数对比
内存角度出发输入:文件将数据写到内存输出:从内存中将数据写入文件系统调用:内核提供的函数,数量有限;库调用:程序库中的函数查看man文档(9卷) :man man标准c库函数和linux系统函数区别:标准c库可以跨平台;(调用了不同平台的系统API)在linux平台中,调用c库函数,底层是调用的是linux中的系统函数linux系统I/O函数是没有缓冲区的,调用一次就会访问一次标准c库I/O函数...原创 2022-04-25 09:52:00 · 1641 阅读 · 1 评论