系统级程序设计
文章平均质量分 73
HenrySmale
张恒汝,博士,西南石油大学教授,硕士生导师,机器学习研究中心副主任,四川省学术和技术带头人后备人选,四川省通信管理局工业互联网领域入库专家,教育部产学合作协同育人项目入库专家,CCF、ACM会员,CAAI粒计算与知识发现专委会委员。
展开
-
实验五:套接字编程实验
一【实验目的】1.掌握面向连接的套接字编程框架;2.掌握面向无连接的套接字编程框架;3.掌握I/O复用、套接字选项设置;4.掌握非阻塞式I/O。二【实验要求】以下每个实验均要求:1.“实验源代码”处:粘贴所编写的程序源码,务必添加关键语句的注释;2.“实验结果”:截图(包括编写的程序和运行结果)粘贴到“实验结果”下方,截图需看到本人的名字及学号;3.有“讨论”的题目,请务必认真回答;三【实验内容】6-1 编写一个套接字程序,要求服务器等待客户的连接请求,一旦有客户连接,服务器打印出客户原创 2022-05-03 17:51:12 · 1225 阅读 · 0 评论 -
实验四:线程编程实验
一【实验目的】1.理解线程环境、线程的生命周期,2.理解线程同步,掌握内核函数的基本用法。3.支撑网络空间安全专业的专业核心能力、综合创新能力。二【实验要求】以下每个实验均要求:1.“实验源代码”处:粘贴所编写的程序源码,务必添加关键语句的注释;2.“实验结果”:截图(包括编写的程序和运行结果)粘贴到“实验结果”下方,截图需看到本人的名字及学号;3.有“讨论”的题目,请务必认真回答;三【实验内容】5-1 编写一个多线程程序:要求主线程创建3个子线程, 3个子线程在执行时都修改一个它们的共原创 2022-05-03 17:49:43 · 1219 阅读 · 0 评论 -
实验三:进程间通信编程实验
一【实验目的】1.理解进程间通信原理;2.掌握进程中信号量、共享内存、消息队列相关的函数的使用;3.支撑网络空间安全专业的专业核心能力、综合创新能力。二【实验要求】以下每个实验均要求:1.“实验源代码”处:粘贴所编写的程序源码,务必添加关键语句的注释;2.“实验结果”:截图(包括编写的程序和运行结果)粘贴到“实验结果”下方,截图需看到本人的名字及学号;3.有“讨论”的题目,请务必认真回答;三【实验内容】4-1 编写程序实现以下功能:利用匿名管道实现父子进程间通信,要求父进程发送字符串原创 2022-05-03 17:45:47 · 1049 阅读 · 0 评论 -
实验二:进程管理编程实验
一【实验目的】1.熟悉进程环境、进程生命周期;2.支撑网络空间安全专业的专业核心能力、综合创新能力。二【实验要求】以下每个实验均要求:1.“实验源代码”处:粘贴所编写的程序源码,务必添加关键语句的注释;2.“实验结果”:截图(包括编写的程序和运行结果)粘贴到“实验结果”下方,截图需看到本人的名字及学号;3.有“讨论”的题目,请务必认真回答;三【实验内容】3-1在Shell环境下使用进程常用命令:ps、pstree、top、at、kill等,记录命令的运行结果。3-2编写一个程序,在主进程原创 2022-05-03 17:42:23 · 616 阅读 · 1 评论 -
实验一:文件操作编程实验
一【实验目的】1.掌握文件或目录属性信息的函数stat()函数的使用;2.掌握目录操作的函数opendir 函数和readdir函数的使用;3.编写程序mysearch.c递归实现打印输出任意目录下,指定类型的所有文件,如:./mysearch /home/temp *.c。二【实验要求】以下每个实验均要求:1.“实验源代码”处:粘贴所编写的程序源码,务必添加关键语句的注释;2.“实验结果”:截图(包括编写的程序和运行结果)粘贴到“实验结果”下方,截图需看到本人的名字及学号;3.有“讨论”原创 2022-05-03 17:40:49 · 696 阅读 · 0 评论 -
Linux编程基础 8.4:epoll工作模式
poll机制的工作原理及流程与select类似,但poll可监控的进程数量不受select中第二个因素——fd_set集合容量的限制,用户可在程序中自行设置被监测的文件描述符集的容量,当然poll在阻塞模式下也采用轮询的方式监测文件描述符集,因此应合理设置poll中监控进程的数量。原创 2024-05-31 11:15:38 · 416 阅读 · 0 评论 -
Linux编程基础 8.3:I/O多路转接服务器
1 简介为进一步提升服务器效率,人们提出了一种被称为I/O多路转接的模型。其中“多路”指代连接到服务器的多个客户端程序,而“转接”则是指在服务器主线与各分支之间设置一个“岗位”,由该岗位实现监控多路连接中数据状态的功能,若某路连接中数据就绪,就通知服务器,使主程序对该路请求作出处理。与多进程和多线程并发服务器相比,I/O多路转接服务器实现了I/O多路复用,系统不必创建多进程或多线程,也不必维护多个进程或线程,因此大大降低了系统开销。Linux系统实现I/O多路转接函数有:select()poll原创 2022-05-18 11:28:38 · 412 阅读 · 0 评论 -
Linux编程基础 8.2:多线程并发服务器
2 多线程并发服务器每个进程可打开的文件描述符数量有限,且进程占用资源较多,系统中进程的数量又受到内存大小的限制,为保证服务器效率,降低服务器消耗,可利用多线程机制搭建并发服务器。【案例2】搭建多线程并发服务器。服务器端:接收多个客户端的数据,并将接收到的数据转为大写,写回客户端;客户端:向服务器发送数据,并将服务器返回的数据打印到终端。pthreadServer.c#include <stdio.h>#include <string.h>#include <原创 2022-05-16 17:34:44 · 284 阅读 · 0 评论 -
Linux编程基础 8.1:多进程并发服务器
多进程并发服务器多线程并发服务器I/O多路转接服务器原创 2022-05-14 10:57:46 · 410 阅读 · 0 评论 -
Linux编程基础 7.3:套接字本地通信
1 socket本地通信socket原本是为网络通讯设计的,但后来在socket框架的基础上发展出了一种IPC(进程通信)机制,即UNIX Domain Socket,专门用来实现使用socket实现的本地进程通信。本地通信的流程与使用的接口与基于TCP协议的网络通信模型相同,其大致流程如下:(1)调用socket()函数通信双方进程创建各自的socket文件;(2)定义并初始化服务器端进程的地址,并使用bind()函数将其与服务器端进程绑定;(3)调用listen()函数监听客户端进程请求;原创 2022-05-13 16:23:03 · 495 阅读 · 0 评论 -
Linux编程基础 7.2:服务器和客户端编程案例
1 网络字节序大端模式:若将数据的高字节保存在内存的低地址,将数据的低字节保存在内存的高地址;小端模式:若将数据的高字节保存在内存的高地址,将数据的低字节保存在内存的低地址。网络数据流:大端模式计算机:大端/小端模式Linux系统中提供了一些用于字节序转换的函数,这些函数存在于函数库arpa/inet.h中,它们的定义如下:uint32_t htonl(uint32_t hostlong);//主机字节序转换为网络字节序(长整型)uint16_t htons(uint16_t hostsh原创 2022-05-13 12:02:21 · 930 阅读 · 0 评论 -
Linux编程基础 7.1:套接字通信流程及编程接口
1 socket编程接口Linux系统中常用的socket网络编程接口有:socket()bind()listen()accept()connect()send()recv()close()其中connect()与send()为客户端专用接口;bind()、listen()、accept()及recv()为服务器端专用接口;socket()与close()则由服务器与客户端共用。...原创 2022-05-10 17:49:53 · 949 阅读 · 0 评论 -
Linux编程基础 6.2:线程同步
2 线程同步线程同步中的“同步”与生活中大家认知的“同步”略有不同,“同”不指同时,其主旨在于协同步调,按预定的先后次序执行线程;之所以需要实现线程同步,是因为若不对线程的执行次序加以控制,可能会出现数据混乱。出现与事件有关的错误的原因有三个:(1)资源共享;(2)调度随机;(3)线程间缺乏必要的同步机制。Linux系统实现线程同步的方式常用的有三种:互斥锁;条件变量;信号量。2.1 互斥锁使用互斥锁的实现线程同步时主要操作分为四步:①初始化互斥锁:pthread_mu原创 2022-05-09 17:49:19 · 752 阅读 · 0 评论 -
Linux编程基础 6.1:线程操作
1 线程操作创建线程挂起线程终止线程其它操作1.1 创建线程#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);原创 2022-05-08 12:00:20 · 1253 阅读 · 0 评论 -
Linux编程基础 5.4:共享内存
5 共享内存共享内存允许两个或多个进程访问给定的同一块存储区域。它是效率最高的一种进程通信方式,节省了不同进程间多次读写的时间;在写进程的操作尚未完成时,不应有进程从共享内存中读取数据。共享内存自身不限制对共享内存的读写次序,程序开发人员应自觉遵循读写规则;一般情况下,共享内存与信号量一起使用,由信号量帮它实现读写操作的同步;Linux提供了如下系统调用来实现共享内存的申请、管理与释放:– shmget– shmat– shmdt– shmctl5.1 shmget函数#includ原创 2022-05-06 17:19:24 · 1035 阅读 · 0 评论 -
Linux编程基础 5.3:信号量
4 信号量信号量是专门用来解决进程同步与互斥问题的一种通信机制,它与信号无关;不同于管道、FIFO以及消息队列,一般不用来传输数据;信号量包括:表示资源数量的非负整型变量、修改信号量的原子操作P和V、该信号量下等待资源的进程队列。使用信号量进行通信时,通常需要如下步骤:创建信号量/信号量集或者获取系统中已有的信号量/信号量集;初始化信号量:早期信号量通常初始化为1,但有些进程一次需要多个同类的临界资源或多个不同类且唯一的临界资源,因此可能需要初始化信号量集;信号量的P、V操作:根据进程请原创 2022-05-06 16:35:31 · 894 阅读 · 0 评论 -
Linux编程基础 5.2:消息队列
内容后面来补充原创 2022-05-05 17:26:55 · 2111 阅读 · 2 评论 -
Linux编程基础 5.1:管道
1 简介Linux进程通信机制:管道信号量消息队列共享内存socket通信原创 2022-05-04 11:24:50 · 2560 阅读 · 0 评论 -
Linux编程基础 4.4:信号学习之信号捕获
5 信号捕获信号的产生是异步事件,进程不知道信号何时会递送,也不会等待信号到来。进程可以为信号注册信号处理函数来实现自定义动作。进程的信号在内核态处理,内核为每个进程准备了一个信号向量表,记录每个信号所对应的处理机制。如果用户自定义了处理方式,则内核会使信号向量表中的指针指向新的信号处理函数。Linux提供了两个捕获信号的函数:signalsigaction5.1 signal函数#include <signal.h>typedef void(* sighandler_t原创 2022-05-03 14:49:29 · 796 阅读 · 4 评论 -
Linux编程基础 4.3:信号学习之信号阻塞
4 信号阻塞在进程PCB中存在两个信号集:信号掩码(signal mask)、未决信号集(signal pending)。两个信号集都是位图,每一位对应一个信号:若mask中某个位被设置为1,则对应的信号将被屏蔽;此时内核会修改pending中该信号对应的位为1,使该信号处于未决态;除非该信号被解除屏蔽,否则内核不会再向进程发送这个信号;用户不能直接操作未决信号集,但可以自定义的set位图与mask进行位操作,以达到屏蔽或解除屏蔽的目的。...原创 2022-05-02 09:31:39 · 667 阅读 · 0 评论 -
Linux编程基础 4.2:信号学习之软件条件
3 软件条件当满足某种软件条件时,也可以驱使内核发送信号。alarmsetitimer3.1 alarm函数#include <unistd.h>unsigned int alarm(unsigned int seconds);函数功能:相当于计时器,驱使内核在指定秒数后发送信号到调用该函数的进程。参数说明:seconds:以秒为单位,整数返回值:若进程不是第一次调用alarm,且上一个alarm尚有剩余秒数,则该函数成功调用后返回旧计时器的剩余秒数,否则返回原创 2022-04-30 11:40:35 · 462 阅读 · 0 评论 -
Linux编程基础 4.1:信号学习之系统调用
1简介信号:软中断信号,是软件层次上对中断的一种模拟,用于提醒进程事件的发生。用户比较容易控制的信号发送方式有:组合按键方式;Shell命令方式;系统调用:kill、raise、abort等。本部分主要以系统调用为主。2 系统调用#include <signal.h>int kill(pid_t pid, int sig);函数功能:给指定进程,是否杀死进程取决于所发送信号的默认动作。参数说明:pid:接收信号的进程id– pid > 0:发送信号sig原创 2022-04-30 10:47:07 · 1042 阅读 · 0 评论 -
Linux编程基础 3.3:进程同步
1 进程同步#include <sys/wait.h>pid_t wait(int *status);功能:挂起进程,进程进入阻塞状态,直到子进程变为僵尸态,如果捕获到子进程的退出信息就会转为运行态,然后回收子进程资源并返回;若没有变为僵尸态的子进程,wait函数就会让进程一直阻塞。若当前进程有多个子进程,只要捕获到一个变为僵尸态的子进程,wait函数就会恢复执行态。参数说明:参数status是一个int *类型的指针,用来保存子进程退出时的状态信息。通常情况下该参数设为NULL,表示原创 2022-04-29 12:05:53 · 1514 阅读 · 0 评论 -
Linux编程基础 3.2:exec函数族
2 exec函数族使用fork()函数创建的子进程,其中包含的程序代码完全相同,只能根据fork()函数的返回值,执行不同的代码分支。由exec函数族中的函数,则可以根据指定的文件名或路径,找到可执行文件。fork:子进程复制父进程的堆栈段和数据段,子进程一旦开始运行,它继承了父进程的一切数据,但实际上数据却已经分开,相互之间不再影响exec:一个进程调用exec类函数,它本身就"死亡"了,系统把代码段替换成新的程序代码,废弃原有数据段和堆栈段,并为新程序分配新数据段与堆栈段exec函数族中原创 2022-04-28 21:04:20 · 2535 阅读 · 0 评论 -
Linux编程基础 3.1:进程控制
1 进程控制fork()exec函数族wait()exit()1.1 创建进程#include <unistd.h>pid_t fork(void);功能:创建进程;函数执行后,系统会创建一个与原进程几乎相同的进程,之后父子进程都继续执行,如图所示:图 fork函数创建子进程参数说明:无返回值说明:成功:返回两个值,子进程创建成功后,原程序会被复制,就有了两个fork函数。父进程的fork函数会返回子进程的pid,子进程的fork函数会返回0.不成功:若子进程创建原创 2022-04-28 17:01:52 · 2675 阅读 · 0 评论 -
Linux编程基础 2.2:文件操作
1 文件操作stat()access()chmod()truncate()link()1.1 stat函数#include <sys/stat.h>int stat(const char *path, struct stat *buf);功能:用于获取文件的属性;参数说明:path:文件路径;buf:接收获取到的文件属性;文件属性存储在inode中,函数从inode结构体中获取文件信息。返回值说明:成功:0不成功:-1并设置errno【案例1】使用sta原创 2022-04-28 16:12:47 · 1288 阅读 · 0 评论 -
Linux编程基础 2.1:Linux文件系统与操作
1 文件I/Oopen()read()write()lseek()close()1.1 open()函数#include <fcntl.h>int open(const char *pathname, int flags[, mode_t mode);open函数参数说明:pathname:待打开文件的文件路径名;flags:访问模式,常用的宏有:– O_RDONLY:只读– O_WRONLY: 只写– O_RDWR: 读写– O_CREAT: 创建一个文件并打原创 2022-04-27 16:56:31 · 2910 阅读 · 2 评论 -
Linux编程基础 1:初识Linux
0 学分、课时、成绩组成本课程3学分(包含上机项目)理论课时24,上机课时24考核方式介绍及各项所占比重1 知识准备计算机网络基础:OSI模型,TCP/IP协议相关知识C语言与数据结构相关的知识:指针,链表,队列,栈等Linux环境编程基础:Code Blocks开发环境的基本使用程序调试技术2 教材及参考文献教材《Linux编程基础》黑马程序员编著,清华大学出版社,2017年10月参考书籍《用TCP/IP进行网际互联》(第三卷)客户-服务器编程与应用,Douglas E.Co原创 2022-04-26 12:02:53 · 4028 阅读 · 1 评论 -
Linux编程基础--目录
本系列教程以《Linux编程基础》为基础,希望在大家的帮助下,逐步完善Linux下系统级程序设计。1 初识Linux1.1 课程简介及Linux介绍2 Linux文件操作2.1:Linux文件系统与操作2.2:文件操作3 进程管理3.1 进程控制3.2 exec家族4 信号4.1 系统调用4.2 软件条件4.3 信号阻塞4.4 信号捕获5 进程间通信5.1 管道5.2 消息队列5.3 信号量5.4 共享内存6 线程6.1 线程操作6.2 线程同步7 套接字编程7原创 2022-05-14 09:54:16 · 951 阅读 · 0 评论