版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统原理与应用第四章进程与线程正大气象厚德载物MinnanUniversityofScienceandTechnology进程与线程CONTENTS01.进程02.进程间通信03.多线程正大气象厚德载物MinnanUniversityofScienceandTechnology01PARTONE进程正大气象厚德载物MinnanUniversityofScienceandTechnology进程简介进程创建和退出wait()和waitpid()
exec函数族进程1、什么是进程进程是一个程序的执行过程,是动态的,包括动态创建、调度、消亡整个过程。资源分配的最小单元。程序是静态的,是一些保存在磁盘上的指令的有序集合,没有任何执行的概念。2、进程的标识进程号(PID,ProcessIdentityNumber):进程的标识,获取当前进程的PID的函数是getpid()。父进程号(PPID,ParentProcessIdentityNumber),获取父进程号为getppid()。进程简介进程简介演示:process.c3、父进程和子进程进程A创建进程B,那进程A就是进程B的父进程,进程B是进程A的子进程。所有进程都是由它的父进程创建出来的,init是所有进程的祖先。4、进程如何被中止进程的中止可以分为两种:正常终止和异常中止正常终止: 1.main函数调用return返回,终止进程。 2.库函数exit终止进程 3.系统调用_exit或者_Exit终止进程。异常中止: 1.调用abort函数终止进程 2.被信号终止进程简介5、进程空间在Linux系统中,进程的用户空间是独立的,相互不影响的;一个进程不能读取或者修改另一个进程的数据,只这样提高了安全性和稳定性。
新进程被创建出来后,便是一个独立的进程,拥有自己独立的进程空间,拥有自己唯一的进程号(PID)、拥有自己独立的PCB(进程控制块),新进程会被内核同等调度执行,参与到系统调用中。进程简介6、进程的生命周期创建、就绪、运行(执行)、等待(阻塞)、退出(终止或者结束)主要由进程调度完成进程状态转换进程简介进程的创建和退出1、进程的创建#include<unistd.h>pid_tfork(void)返回值:成功:0或者大于0的整数
失败:-1注意:当一个进程调用fork()成功后,fork()在父子两个进程中都会返回,父进程返回值子进程的PID;子进程返回0。操作4.1:fork_sample.c进程的创建和退出2、进程的退出:exit和_exit函数exit和_exit都是C语言标准库中的函数,用于终止程序的执行#include<stdlib.h>voidexit(intstatus);参数:status进程终止的状态,零这表示正常终止。
如果status为非零,这表示进程异常终止。intatexit(void(*)(void));这个函数会注册一个函数,该函数会在程序正常终止时被调用。进程的创建和退出2、进程的退出exit和_exit函数exit和_exit都是C语言标准库中的函数,用于终止程序的执行#include<unistd.h>void_exit(intstatus)参数:status进程终止的状态。 _exit函数则立即终止程序,不会执行任何清理操作,也不会关闭打开的流或释放动态分配的内存。exit函数最后会调用_exit函数来终止程序。进程的创建和退出2、进程的退出-
exit和_exit函数操作4.5:exit.c等待子进程退出---wait()和waitpid()子进程的状态变化:1.子进程终止2.子进程因为收到停止信号而停止运行。(SIGSTOP、SIGSTP)3.子进程在停止状态下因为收到恢复信号而恢复运行。(SIGCONT)父进程监视子进程进程退出时会关闭所有文件描述符,释放在用户空间分配的内存,但是进程控制块PCB会暂时保留,里面存放退出状态。比如一个进程正常退出,进程控制块PCB里就存放进程的退出状态(退出码);如果是异常退出,那么进程控制块PCB里存放导致该进程终止的信号进程等待等待子进程退出---wait()和waitpid()1.确保时序问题:子进程先退出,父进程再退出2.资源回收,防止内存泄露的问题进程等待的必要性wait()函数waitpid()函数进程等待的方式等待子进程退出---wait()和waitpid()status:子进程退出状态;pid:<-1
表示等待进程组ID等于pid绝对值的任何子进程。-1 表示等待任何子进程。0 表示等待任何子进程,其进程组ID等于调用进程的进程组ID。
>0 表示等待子进程ID等于pid的值。options:
WNOHANG
没有子进程退出立即返回(非阻塞等待)#include<sys/types.h>#include<sys/wait.h>pid_twait(int*status);pid_twaitpid(pid_tpid,int*status,intoptions);等待子进程退出---wait()和waitpid()头文件#include<sys/types.h>和<sys/wait.h>1.pid_twait(int*status)用于使父进程阻塞,直到一个子进程结束或该进程接到了一个指定的信号为止。参数:status用于存放子进程终止时候的状态信息返回值:成功返回终止的子进程号。失败返回-12.pid_twaitpid(pid_tpidint*status,intoption)等待指定pid的进程,可以是非阻塞的。参数:pid用于表示需要等待的某个具体的子进程 status用于存放子进程终止时候的状态信息 option是一个选项标志,用于控制waitpid()的行为。返回值:成功返回终止的子进程号。失败返回-1等待子进程退出---wait()和waitpid()status:子进程退出状态;WIFEXITED(status):子进程正常退出,此宏为真WEXITSTATUS(status):子进程正常退出,获取子进程的退出值WIFSIGNALED(status):子进程被信号杀死,此宏为真WTERMSIG(status):子进程被信号杀死,获取导致子进程死亡的信号WCOREDUMP(status):子进程被信号杀死或生成核心存储文件,此宏为真WIFSTOPPED(status):子进程被信号暂停,options=WUNTRACED,此宏为真WSTOPSIG(status):WIFSTOPPED(status)为真,获取导致子进程暂停的信号值WIFCONTINUED(status):子进程被SIGCONT重置,此宏为真等待子进程退出---wait()和waitpid()操作4.3:wait.c操作4.4:waitpid.cexec函数族path和file:被加载的执行的文件或脚本路径;arg:列表形式的参数;argv:数组形式的参数;envp:用户自定义的环境变量数组。#include<unistd.h>intexecl(constchar*path,constchar*arg,...);intexeclp(constchar*file,constchar*arg,...);intexecle(constchar*path,constchar*arg,...);intexecv(constchar*path,char*constargv[]);intexecvp(constchar*file,char*constargv[]);intexecvpe(constchar*file,char*constargv[],char*constenvp[]);exec函数族path和file:被加载的执行的文件或脚本路径;arg:列表形式的参数;argv:数组形式的参数;envp:用户自定义的环境变量数组。l:参数以列表(list)的方式提供v:参数以矢量(vector)数组方式提供p:利用环境变量PATH来指定可执行文件e:用户提供自定义的环境变量(environment)exec函数族1.child.c写一个main程序,传入参数为字符串数组,将传入的参数打印出来。编译程序,生成二进制可执行文件child2.exec.c写一个main函数,调用fork()创建一个子进程,在子进程中调用execl函数去执行另一个程序child。编译验证是否可以正常执行child。操作4.2:exec.cchild.c1、fork()、wait()、waitpid()、exit()/_exit()、exec函数簇2、作业
编写程序实现生成5个子进程。3、思政:
总结与作业THANKYOU!02PARTTWO进程间通信正大气象厚德载物MinnanUniversityofScienceandTechnology进程间通信概述无名管道、有名管道通信消息队列信号共享内存信号量进程间通信进程间通信
每个进程是操作系统中独立的执行体,彼此隔离,并具有自己的生命周期。为了合作完成指定任务,进程之间也需要进行数据交互和同步。Linux系统通过不同方式实现进程间通信和同步。不同的方式适用于不同的场合,用户可根据实际需要选择合适的进程间通信和同步机制。进程间的通信方式:管道通信、信号、内存共享、消息队列、信号量、套接字管道通信管道通信管道是Linux系统中进程间的半双工通信方式。如果进程A和进程B通过管道连接起来,那么数据就能够通过管道由进程A流向进程B,或者由进程B流向进程A。管道是单向的、先进先出的。管道通信的类型:无名管道:用于父进程和子进程间的通信有名管道:可用于运行于同一系统中的任意两个进程间的通信管道的创建所需头文件#include<unistd.h>函数原型intpipe(intpipefd[2]);函数传入值pipefd[2]:管道的两个文件描述符,pipefd[0]用于管道的读端,pipefd[1]用于管道的写端。函数返回值成功:0失败:-1所需头文件#include<sys/types.h>#include<sys/stat.h>函数原型intmkfifo(constchar*pathname,mode_tmode);函数传入值pathname:要创建的管道,创建之前不能存在mode:管道的访问权限,如0666函数返回值成功:0失败:-1无名管道有名管道管道通信管道的关闭关闭管道只需将这两个文件描述符关闭即可,可以使用普通的close函数逐个关闭。操作4.6:pipe.c操作4.7:w_fifo.cr_fifo.c消息队列管道只能传输无格式的字节流,会给应用程序开发带来不便,而消息队列克服了此缺点。消息队列就是一个消息的链表,可以把消息看作一个具有特定格式的记录。进程可以从消息队列中添加消息,另一些进程则可以从消息队列中读取消息。消息结构体必须自己定义,但必须按照系统的要求定义,消息结构体如下:structmsgbuf{ longmsgtype;//消息类型,必须是long型 charname[SIZE];//消息正文};消息队列消息队列1、键值系统建立IPC通信(消息队列、信号量和共享内存)时必须指定一个ID值,该值通过ftok()函数获取所需头文件#include<sys/types.h>#include<sys/ipc.h>函数原型key_tftok(constchar*pathname,intproj_id);函数传入值pathname:文件名proj_id:项目名,不为0即可函数返回值成功:返回文件名对应的键值失败:-1消息队列2、打开/创建消息队列所需头文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函数原型intmsgget(key_tkey,intmsgflg);函数传入值key:消息队列的键值,多个进程可通过它访问同一个消息队列msgflg权限标志位IPC_CREAT:创建IPC_EXCL:如果不存在则创建,否则返回错误IPC_NOWAIT:不阻塞函数返回值成功:返回消息队列ID失败:-1消息队列3、发送消息所需头文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函数原型intmsgsnd(intmsqid,constvoid*msgp,size_tmsgsz,intmsgflg);函数传入值msqid:消息队列的队列IDmsgp:指向消息结构的指针,消息结构格式如前所述msgsz:消息正文的字节数msgflg发送标志IPC_NOWAIT:若消息无法立即发送,函数立即返回,比如消息队列已满0:阻塞等待,直到发送成功为止函数返回值成功:0失败:-1消息队列4、读取消息所需头文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函数原型ssize_tmsgrcv(intmsqid,void*msgp,size_tmsgsz,longmsgtyp,intmsgflg);函数传入值msqid:消息队列的队列IDmsgp:消息缓冲区,将消息存放在消息结构体中msgsz:消息正文的字节数msgtyp0:接受消息队列中的第一个消息大于0:接受消息队列中第一个类型为msgtyp的消息小于0:接受消息队列中第一个类型值不小于msgtyp绝对值且类型值最小的消息msgflgMSG_NOERROR:返回的消息比msgsz多,消息被截短为msgsz字节且不通知消息发送进程IPC_NOWAIT:消息队列中没有相应类型的消息可以接收,立即返回0:阻塞直到接受一条相应消息为止函数返回值成功:0失败:-1消息队列5、消息控制所需头文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函数原型intmsgctl(intmsqid,intcmd,structmsqid_ds*buf);函数传入值msqid:消息队列的队列IDcmdIPC_STAT:读取消息队列的数据结构msgid_ds,并将其存储在buf指定地址中IPC_SET:设置消息队列的数据结构msqid_ds中的ipc_perm域IPC_RMID:删除msqid标识的消息队列buf描述消息队列的msgid_ds结构类型变量函数返回值成功:0失败:-1操作4.9:snd_msg.crcv_msg.c信号Linux的信号在软件层面对硬件中断进行模拟。运行中的进程会收到内核或其他进程发来的信号。接收到信号后,进程根据预先设置的动作对信号进行处理kill-l--->查看信号类型在Linux系统中,进程对信号的响应主要有三种形式:(1)忽略信号:进程将忽略信号,不做任何响应,但对于信号SIGKILL和SIGSTOP,进程不能够忽略;(2)默认动作:对于给定的信号采用系统默认操作;
(3)捕捉信号:对于给定的信号预先设置信号处理函数,收到信号后,进程将执行信号处理函数所需头文件#include<signal.h>函数原型typedefvoid(*sighandler_t)(int);sighandler_tsignal(intsignum,sighandler_thandler);函数传入值signum:要捕捉的信号handler
函数返回值成功:原来的信号处理函数指针失败:-1操作4.12:signal.c信号信号共享内存共享内存是进程间高效数据传输通信方式。进程通过共享内存实现数据通信,先将其映射到进程地址空间,然后访问该地址空间,进行读写操作,就能够实现对共享内存的读写。当多个进程对同一个共享内存进行操作时,为了保证数据的一致性,往往通过同步机制对其进行保护,比如互斥锁或信号量。共享内存共享内存实现分为两个步骤:(1)创建共享内存,使用shmget函数。(2)映射共享内存,将这段创建的共享内存映射到具体的进程空间去,
共享内存进程A的逻辑地址空间物理空间进程B的逻辑地址空间共享内存(1)创建共享内存函数所需头文件#include<sys/ipc.h>#include<sys/shm.h>函数原型intshmget(key_tkey,size_tsize,intshmflg);函数传入值key:共享内存的键值,每一个IPC对象与一个key相对应,key为IPC_PRIVATE指创建私有共享内存size:共享内存区大小shmflg:标志,与open的权限位相同,可用八进制表示,如0666函数返回值成功:共享内存ID失败:-1所需头文件#include<sys/ipc.h>#include<sys/shm.h>函数原型void*shmat(intshmid,constvoid*shmaddr,intshmflg);函数传入值shmid:共享内存IDshmaddr:将共享内存映射到指定地址,0表示系统自动分配地址并把共享内存映射到调用进程的地址空间shmflgSHM_RDONLY:共享内存只读0:可读可写函数返回值成功:被映射的段地址失败:-1(2)映射共享内存的函数共享内存(3)共享内存解除所需头文件#include<sys/ipc.h>#include<sys/shm.h>函数原型intshmdt(constvoid*shmaddr);函数传入值shmaddr:被映射的共享内存段地址函数返回值成功:0失败:-1所需头文件#include<sys/ipc.h>#include<sys/shm.h>函数原型intshmctl(intshmid,intcmd,structshmid_ds*buf);函数传入值shmid:共享内存ID
cmdIPC_RMID:删除shmid指向的共享内存段SHM_LOCK:锁定共享内存,只能有超级用户请求SHM_UNLOCK:对共享内存段解锁,只能超级用户请求buf:描述共享内存段的shmid_ds结构函数返回值成功:0失败:-1(4)共享内存操作操作4.14:w_shm.cr_shm.c信号量Linux操作系统中的信号实现进程之间的异步通信,信号量则是用于进程间的步控制。在程序中,有时会存在一种特殊代码,同一时间只允许一个进程执行该部分代码。这部分区域,被称为"临界区"。在多进程并发执行中,当一个进程进入临界区,因某种原因被挂起时,其他进程就有可能也进入该区域。解决办法——使用信号量信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目。只能对信号量执行P操作和V操作。P操作:申请资源。如果信号量的值>0,则把该信号量-1。
如果信号量的值=0,则挂起该进程(代表没有资源可用)。V操作:释放资源。如果有进程因该信号量而被挂起,则恢复当前进程运行。
如果没有进程因该信号量而被挂起,则把该信号量+1。信号量信号量的操作通常分为以下几个步骤。(1)创建信号量或获取信号量;(2)初始化信号量;(3)进行信号量的PV操作;(4)如果不需要信号量,从系统中删除它。1、信号量创建所需头文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>函数原型intsemget(key_tkey,intnsems,intsemflg);函数传入值key:信号量键值nsems:信号量个数semflg:访问权限和创建标识,可用八进制表示,如0666,IPC_CREAT表示创建新信号量,IPC_EXCL表示如果信号量已经存在则该函数返回出错,防止重复创建。函数返回值成功:信号量ID失败:-1信号量2、信号量操作所需头文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>函数原型intsemctl(intsemid,intsemnum,intcmd,unionsemunarg);函数传入值semid:信号量IDsemnum:信号量编号,通常取0,当使用信号量集才用到cmd:对信号量的各种操作IPC_STAT:获取信号量信息SETVAL:将信号量值设置为argGETVAL:获取信号量值IPC_RMID:删除信号量arg:需要设置或获取信号量的结构,是unionsemnn结构,要自己定义。结构如下:unionsemun{ intval; structsemid_ds*buf; unsignedshort*array;};函数返回值IPC_STAT、SETVAL、IPC_RMID:返回0GETVAL:返回信号量的当前值失败:-1(1)控制信号量信号量2、信号量操作(2)操作信号量所需头文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>函数原型intsemop(intsemid,structsembuf*sops,size_tnsops);函数传入值semid:信号量IDsops:信号量结构体structsembuf{shortsem_num;//信号量编号,使用单个信号量时,通常取值为0shortsem_op;//信号量操作:取值为-1表示P操作,取值为+1表示V操作shortsem_flg;//通常设为SEM_UNDO。进程没释放信号量时,系统自动释放};nsops:操作数组sops中的操作个数,通常为1函数返回值成功:信号量标识符失败:-1操作4.15:sem.c总结:1、无名管道、有名管道2、消息队列3、信号4、共享内存5、信号量作业:3、思政:
总结与作业THANKYOU!网络编程网络编程的概述网络编程基础网络编程实例
网络编程1、什么是网络编程网络编程就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。通俗点也就是让分布在不同地方的计算机通过网线或其他媒介相互连接在一起,形成网络,网络中每台计算机相互之间都能进行通信。2、Linux网络编程的核心概念网络编程的核心有:套接字(Sockets)、IP地址、端口号、传输控制协议(TCP)和用户数据报协议(UDP)等等网络编程概述1、网络模型网络编程基础1、网络模型网络编程基础2、协议概念:协议是事先约定好,大家共同遵守的一组规则。从应用程序的角度看,协议可以理解为数据传输和数据解析的规则。假设A、B双方要传输文件,规定:第一次:传输文件名,接收方收到文件名,应答OK给传输方第二次:发送文件的尺寸,接收方收到该数据,再次应答一个OK第三次:传输文件内容,同样接收方收到数据完成后,应答OK表示文件内容接收成功。网络编程基础2、协议2.1IP协议IP协议也叫网际协议,特指为实现一个相互连接的网络系统上从源地址到目的地址传输数据包(互联网数据包)所提供必要功能的协议。特点:不可靠、无连接网络编程基础2、协议2.2TCP协议TCP协议是一种面向连接的,可靠的传输层通信协议。主要是提供不同主机上的进程通信。特点:1.建立连接
使用链接
释放连接(虚电路) 2.TCP数据包中包含序号和确认序号。 3.对包进行排序并检错,而损坏的包可以被重传。服务对象:
需要高度可靠性且面向连接的服务,如HTTP、FTP、SMTP等等网络编程基础2、协议2.3UDP协议UDP是一种面向无连接的传输层通信协议。主要也是提供不同主机上的进程间通信。特点:1.发送数据之前不需要建立链接。 2.不对数据包的顺序进行检查。 3.没有错误检测和重传机制服务对象:
主要用于“查询-应答”的服务,如NFS、NTP、DNS等。网络编程基础3、MAC地址、IP地址3.1MAC地址 MAC地址,用于表示网络设备,类似于身份证,且理论上全球唯一。组成:以太网的MAC地址是一个48bit的值。网络编程基础3、MAC地址、IP地址、端口号3.2IP地址
IP地址是一种Internet上的主机编码方式,也称为网际协议地址。它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IPV4地址的组成 IPV4一般使用10进制字符串标识,比如。网络编程基础3、MAC地址、IP地址、端口3.3端口 TCP/IP协议采用端口标识通信的进程,用于区分一个系统里面的多个进程。特点:1.对于同一个端口而言,在不同系统中对应着不同的进程 2.对于同一个系统,一个端口只能被一个进程拥有 3.一个进程拥有一个端口后,传输层送到该端口的数据全部被该进程接收,同样的,进程送交传输层的数据也通过该端口被送出。网络编程基础3、MAC地址、IP地址、端口3.3端口
端口号,在网络程序中,端口号(port)来标识一个运行的网络程序。特点:1.端口号是一个无符号短整形的类型 2.每个端口都拥有一个端口号 3.TCP、UDP维护各自独立的端口号4.网络应用程序中,至少要占用一个端口号,也可以占有多个端口号。端口号分配:知名端口(1-1023)、动态端口(1024-65535)网络编程基础4、字节序的概述
是指多字节的存储顺序。分类:
小端格式:将低位字节数据存储在低地址。低字节优先
大端格式:将高位字节数据存储在低地址。高字节优先特点:1.一般网络协议指定了通讯字节序为大端格式 2.只有在多字节数据处理才需要考虑字节序 3.运行同一台计算机上的进程相互通信时,一般不考虑字节序。 4.异构计算机之间通讯,需要转换自己的字节序为网络字节序。网络编程基础4、字节序的概述字节序转换函数:头文件#include<arpa/inet.h>uint32_thtonl
(uint32_thostint32)
功能:将32位的主机字节序转换为网络字节序参数:一个
uint32_t
类型的数值,表示主机字节顺序的值。返回值:转换后的网络字节顺序的
uint32_t
类型的值。uint16_thtons
(uint16_thostint16)
功能:将16位的主机字节序转换为网络字节序参数:一个
uint16_t
类型的数值,表示主机字节顺序的值。返回值:转换后的网络字节顺序的
uint16_t
类型的值。网络编程基础4、字节序的概述字节序转换函数:头文件#include<arpa/inet.h>uint32_tntohl
(uint32_tnetint32)
功能:将32位的网络字节序转换为主机字节序参数:一个
uint32_t
类型的数值,表示网络字节顺序的值。返回值:转换后的主机字节顺序的
uint32_t
类型的值。uint16_tntohs
(uint16_tnetint16)
功能:将16位的网络字节序转换为主机字节序参数:一个
uint16_t
类型的数值,表示网络字节顺序的值。返回值:转换后的主机字节顺序的
uint16_t
类型的值。操作1:byteOrderConvert.c网络编程基础4、地址转换函数#include<arpe/inet.h>intinet_pton(intfamily,constchar*strptr,void*addrptr);功能:将点分十进制的ip地址转化为32位无符号整型数参数: family:协议族(IPv4地址,使用AF_INET) strptr:点分十进制数串 addrptr:32位无符号整型地址
返回值:成功1,失败其他网络编程基础4、地址转换函数#include<arpe/inet.h>constchar*inet_ntop(intfamily,void*addrptr,constchar*strptr,size_tlen);功能:将32位无符号整型数转换为点分十进制串参数: family:协议族(IPv4地址,使用AF_INET) addrptr:32位无符号整型地址 strptr:点分十进制数串 len:strptr缓存区长度返回值:成功:范围字符串的首地址,失败:返回NULL网络编程基础4、地址转换函数操作2:ipaddrConvert.c网络编程基础4、地址转换函数int
inet_addr(const
char
*cp)功能:将点分十进制ip地址转化为整形数据
参数
cp:点分十进制ip地址返回值:成功:整型数据char*inet_ntoa(structin_addrin)功能:将整型数据转换为十进制IP地址参数:in:保存IP地址的结构体返回值:成功:点分十进制IP地址只能用于IPV4的地址!!!网络编程基础5、网络的编程接口socket(套接字) Linux中的网络编程通过Socket(套接字)实现,Socket是一种文件描述符。提供不同主机上的进程之间的通信。特点: 1.socket也称“套接字” 2.是一种文件描述符,代表了一个通信管道的一个端点 3.类似文件的操作一样,可以使用read/write/close等函数对socket套接字进行网络数据的收取和发送等操作。 4.得到socket套接字的方法就是调用函数socket();网络编程基础5、网络的编程接口socket(套接字)socket的分类:•流式套接字(SOCK_STREAM)
流式套接字可以提供可靠的、面向连接的通讯流,它使用TCP协议。TCP保证了数据•传输的正确性和顺序性。数据报套接字(SOCK_DGRAM)数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错,它使用数据报协议UDP。•原始套接字(SOCK_RAW)原始套接字允许使用IP协议,主要用于新的网络协议的测试等。网络编程基础5、网络的编程接口socket(套接字)#include<sys/socket.h>intsocket(intfamily,inttype,intprotocol)功能:创建一个用于网络通信的socket套接字(文件描述符)参数: family:协议族(IPv4地址,使用AF_INET) type:套接字类型 protocol:协议类别,通常填0返回值:套接字网络编程基础5、网络的编程接口socket(套接字)#include<sys/socket.h>intbind(intsockfd,conststructsockaddr*addr,socklen_taddrlen)功能:用于将套接字与特定的IP地址和端口号绑定参数:
sockfd:套接字描述符,由socket函数返回。 addr:指向structsockaddr结构体的指针,该结构体中包含了要绑定的IP地址和端口号。对于IPv4地址,通常使用structsockaddr_in结构体。 addrlen:addr结构体的长度,以字节为单位。例如,对于structsockaddr_in,该值应为sizeof(structsockaddr_in)。返回值如果绑定成功,返回0。如果绑定失败,返回-1网络编程基础5、网络的编程接口socket(套接字)#include<sys/socket.h>intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);功能:用于建立与远程主机的连接的函数参数:
sockfd:套接字描述符,由socket函数返回。它标识了要进行连接操作的套接字。 addr:指向structsockaddr结构体的指针,该结构体中包含了要连接的远程主机的IP地址和端口号。对于IPv4地址,通常使用structsockaddr_in结构体。 addrlen:addr结构体的长度,以字节为单位返回值:如果连接成功建立,返回0。如果连接失败,返回-1,网络编程基础5、网络的编程接口socket(套接字)#include<sys/socket.h>intlisten(intsockfd,intbacklog);功能:使服务器套接字进入监听状态的函数参数:sockfd:服务器套接字的文件描述符,通常是由socket函数创建并返回的。 backlog:指定同时连接的最大挂起数,即在服务器开始拒绝新的连接请求之前,可以排队等待处理的未完成连接的最大数量。该参数用于控制并发连接的数量。返回值:成功,返回0。失败,返回-1,网络编程基础5、网络的编程接口socket(套接字)#include<sys/socket.h>intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen);功能:接受客户端连接的函数之一参数:sockfd:服务器端的套接字描述符。 addr:指向structsockaddr结构体的指针,用于存储客户端的地址信息。当accept函数成功返回时,该结构体将被填充客户端的地址信息。通常使用structsockaddr_in结构体来表示IPv4地址。 addrlen:指向socklen_t类型的指针,表示addr结构体的长度。在调用accept函数之前,应将该值设置为addr结构体的实际大小。返回值:成功,它会返回一个新的套接字。失败,返回-1,网络编程基础5、网络的编程接口socket(套接字)#include<sys/socket.h>ssize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);功能:在网络套接字上进行数据发送的函数参数:sockfd:套接字描述符,表示发送数据的套接字。 buf:指向要发送数据的缓冲区的指针。 len:要发送数据的字节数。 flags:发送选项的标志位,可以是0或者一些特定的选项按位或运算的结果。常用的选项包括MSG_DONTWAIT(非阻塞发送)等。返回值:成功,返回实际发送的字节数。失败,返回-1,网络编程基础5、网络的编程接口socket(套接字)#include<sys/socket.h>ssize_trecv(intsockfd,void*buf,size_tlen,intflags);功能:在网络套接字上进行数据接收的函数参数:sockfd:套接字描述符,表示接收数据的套接字。 buf:指向接收缓冲区的指针,用于存储接收到的数据。 len:接收缓冲区的长度,即最大可接收的字节数。 flags:接收选项的标志位,可以是0或者一些特定的选项按位或运算的结果。常用的选项包括MSG_DONTWAIT(非阻塞接收)等。返回值:成功:实际接收的字节数,失败:-1网络编程基础5、网络的编程接口socket(套接字)#include<sys/socket.h>ssize_tsendto(intsockfd,constvoid*buf,size_tlen,intflags,conststructsockaddr*dest_addr,socklen_taddrlen);功能:用于在网络套接字上进行数据发送和接收的函数,与send和recv函数类似,但提供了更多的功能参数:sockfd:套接字描述符,表示发送数据的套接字。 buf:指向要发送数据的缓冲区的指针。 len:要发送数据的字节数。 flags:发送选项的标志位 dest_addr:指向目标地址的指针,表示数据要发送到的目标地址。该地址应该是由sockaddr结构体或其兼容类型(如sockaddr_in)表示的。 addrlen:目标地址的长度,以字节为单位。返回值:成功:实际发送的字节数,失败:-1网络编程基础5、网络的编程接口socket(套接字)#include<sys/socket.h>ssize_trecvfrom(intsockfd,void*buf,size_tlen,intflags,structsockaddr*src_addr,socklen_t*addrlen);功能:用于在网络套接字上进行数据发送和接收的函数,与send和recv函数类似,但提供了更多的功能参数:sockfd:套接字描述符,表示接收数据的套接字。 buf:指向接收缓冲区的指针,用于存储接收到的数据。 len:接收缓冲区的长度,即最大可接收的字节数。 flags:接收选项的标志位, src_addr:指向源地址的指针,用于存储发送端的地址信息。该地址应该是由sockaddr结构体或其兼容类型(如sockaddr_in)表示的。如果不关心发送端的地址信息,可以将该参数设置为NULL。 addrlen:指向源地址长度的指针,表示src_addr结构体的长度。在调用函数之前,应将该值设置为结构体的大小。返回值:成功:实际接收的字节数,失败:-1网络编程基础1.TCP网络程序的设计基于TCP-服务器1.创建一个socket,用函数socket()2.绑定IP地址、端口等信息到socket上,用函
数bind()3.设置允许的最大连接数,用函数listen()4.等待来自客户端的连接请求,用函数accept()5.收发数据,用函数send()和recv(),或者read()和write()6.关闭网络连接网络编程实例1.TCP网络程序的设计基于TCP-客户端1.创建一个socket,用函数socket()2.设置要连接的服务器的IP地址和端口等属性3.连接服务器,用函数connect()4.收发数据,用函数send()和recv(),或者read()和write()5.关闭网络连接网络编程实例1.TCP网络程序的设计网络编程实例2.UDP网络程序的设计基于UDP-服务器1.创建一个socket,用函数socket()2.绑定IP地址、端口等信息到socket上,
用函数bind()3.循环接收数据,用函数recvfrom()4.关闭网络连接基于UDP-客户端1.创建一个socket,用函数socket()2.绑定IP地址、端口等信息到socket上,用函数bind()3.设置对方的IP地址和端口等属性4.发送数据,用函数sendto()5.关闭网络连接网络编程实例2.UDP网络程序的设计网络编程实例网络程序的实例实例:tcp_server.c和tcp_client.c实例:udp_server.c和udp_client.cTHANKYOU!03PARTTHERE正大气象厚德载物MinnanUniversityofScienceandTechnology多线程编程线程简介线程的基本操作线程的程序编写线程1、什么是线程线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。2、线程和进程的比较1)调度2)拥有资源3)系统开销4)并发性一、线程简介3、多线程多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。应用:多任务程序设计、并发程序设计、网络程序设计、共享数据……4、线程号进程号在整个系统中是唯一的,但线程号不同,线程号只在它所属的进程环境中有效。进程号用pid_t数据类型表示,是一个非负整数。线程号则用pthrcad_t数据类型来表示。一、线程简介5、线程四种状态迁移图一、线程简介就绪态创建被调度运行态被抢占阻塞态等待资源条件被满足终止态完成或者被取消1、线程的创建#include<pthread.h>int
pthread_create(pthread_t
*thread,
const
pthread_attr_t
*attr, void
*(*start_routine)(void*),
void
*arg);参数: thread:所创建的线程号
attr:所创建的线程属性,一般为none
start_routine:即将运行的线程函数。
arg:传递给线程函数的参数。返回值:
成功:0
失败:非0二、线程的基本操作线程创建操作1:pthread_create.c操作1:1)设置一个全局变量intnumber;默认初值为82)在主函数中创建两个线程,线程1创建的时候,传递给线程函数的参数为字符串“hellothread_fun1!”,线程2创建的时候不传递参数。并且在线程创建失败时候都打印失败提示。3)在线程处理函数1中,打印传递进来的参数,并且相隔1S把全局变量number加1,并打印当前线程处理函数名和number的值。在线程处理函数2中,打印线程处理函数的名字和number的值。4)编译程序,验证多线程实现多任务及线程间共享全局变量
和线程函数传参数注意:线程函数的程序在pthead库中个,
故链接的时候要加上参数-lpthread.
2、线程等待
int
pthread_join(pthread_tthread,
void
**value_ptr);
功能:等待子线程结束,并回收子线程资源
参数: thread:等待退出线程的线程号。
value_ptr:存储线程退出状态的指针的地址。
返回值:
成功为0,不成功为非0二、线程的基本操作3、线程分离intpthread_detach(pthread_tthread)功能:使调用线程与当前线程分离,使其成为一个独立的线程,该线程终止时,系统将自动回收它的资源。参数:thread:线程号返回值:成功:返回0,失败返回非0.二、线程的基本操作线程分离操作3:pthread_detach.c操作3:1)编写代码验证线程分离,并验证分离后是否还可以pthread_join
来接合它了。注意:线程函数的程序在pthead库中个,
故链接的时候要加上参数-lpthread.4、线程退出线程的三种退出方式:1、线程从执行函数中返回,return(自然死亡)2、线程调用pthread_exit退出线程
(自杀)3、线程可以被同一进程中的其他线程取消pthread_cancle(他杀)
voidpthread_exit(void*retval)功能:退出调用线程参数:retval:存储线程退出状态的指针注:一个进程中的多个线程是共享该进程的数据段,因此,通常线程退出后占用的资源不会释放。二、线程的基本操作线程退出操作4:pthread_exit.c操作4:1)拿刚写的pthread_join.c程序来更改。2)更改线程1处理函数,i++;当i=5的时候,直接returnNULL,验证线程自然死亡现象。验证完了后再更改为调用
pthread_exit(pstr);验证线程自杀现象。3)编译验证结果。注意:线程函数的程序在pthead库中个,
故链接的时候要加上参数-lpthread.5、线程取消intpthread_cancel(pthread_tthread)
功能:发送终止信号给thread线程返回值:如果成功则返回0,否则为非0值。注:发送成功并不意味着thread会终止。pthreadsetcancelstate(intstate,int*old_state);state:PTHREAD_CANCEL_DISABLE,不可以被取消PTHREAD_CANCEL_ENABLE,可以被取消Old_state:保存调用线程原来的可取消状态的内存地址。二、线程的基本操作5、线程取消voidpthread_testcancel(void);设置取消点当别的线程取消调用此函数的线程时候,被取消的线程执行到此函数时结束。pthread_setcanceltype(inttype,int*oldtype)设置取消类型tppe:PTHREAD_CANCEL_ASYNCHRONOUS立即取消PTHREAD_CANCEL_DEFERRED不立即取消oldtype:
保存调用线程原来的可取消类型的内存地址。二、线程的基本操作总结:1、线程简介2、进程创健、等待、分离、退出、取消作业:1、编写程序实现创建5个线程
3、思政:
总结与作业THANKYOU!嵌入式系统原理与应用第三章文件I/O编程正大气象厚德载物MinnanUniversityofScienceandTechnology文件I/O编程CONTENTS01.系统调用---文件访问02.标准I/O---文件访问03.S5P6818文件操作实例正大气象厚德载物MinnanUniversityofScienceandTechnology01PARTONE系统调用---文件访问正大气象厚德载物MinnanUniversityofScienceandTechnology任务实现:在广告屏上显示“中华人民共和国成立75周年”宣传图Linux中文件编程可以使用两种方法:Linux系统调用:依赖于Linux系统C语言库函数:与操作系统是独立的,在任何操作系统下,使用C语言库函数操作文件的方法都是相同的。文件编程在数字世界中,文件不仅是数据的载体,更是信息安全的前线,掌握文件操作就像是通往打开数字宝库的钥匙,而Linux下一切皆文件,文件操作尤其重要。
系统调用---创建文件(creat)filename:要创建的文件名(包含路径,缺省为当前路径)mode:创建模式,常见创建模式有S_IRUSR 可读4S_IWUSR 可写2S_IXUSR 可执行1S_IRWXU 可读可写可执行7intcreat(constchar*filename, mode_tmode)系统调用---access功能:判断文件是否可以进行某种操作(读,写,存在等)pathname:文件名称mode:要判断的访问权限。可以取以下值或者是他们的组合。R_OK:文件可读,W_OK:文件可写,X_OK:文件可执行,F_OK:文件存在。返回值:当测试成功时,函数返回0,否则如果一个条件不符时,返回-1。intaccess(constchar*pathname,intmode)系统调用---打开文件(open)pathname:要打开的文件名(包含路径,缺省为当前路径)flags:打开标志mode:被打开文件的权限返回值:成功为文件描述符,失败为-1intopen(constchar*pathname,intflags)intopen(constchar*pathname,intflags,mode_tmode)系统调用---关闭文件(close)fd:文件描述符返回值:成功为0,失败为-1intclose(intfd)操作3.1:open_count.c操作3.2:access_creat.c系统调用---read功能:从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中。fd:文件描述符buf:读出数据的缓冲区length:读出的字节数返回值:成功为实际读取的字节数,到达文件结尾为0,失败为-1。intread(intfd,constvoid*buf,size_tlength)系统调用---write功能:把length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。fd:文件描述符buf:写入数据的缓冲区length:写入数据的字节数返回值:成功已写的字节数,失败为-1intwrite(intfd,constvoid*buf,size_tlength)操作3.3:my_copy.c系统调用---lseek功能:将文件读写指针相对whence移动offset个字节。fd:文件描述符offset:偏移量,负(向前移),正(向后移)whence:相对位置SEEK_SET:当前位置为文件的开头 SEEK_CUR:当前位置为文件指针的位置 SEEK_END:当前位置为文件的结尾返回值:成功为文件的当前位移,失败为-1intlseek(intfd,offset_toffset,intwhence)操作3.4:read_wav.c1、open、close、read、write、creat、lseek、access2、作业3、思政:在数字世界中,文件不仅是数据的载体,更是信息安全的前线,掌握文件操作就像是通往打开数字宝库的钥匙。
总结与作业THANKYOU!02PARTTWO标准I/O---文件访问正大气象厚德载物MinnanUniversityofScienceandTechnology标准I/O---打开文件(fopen)path:要打开的文件名(包含路径,缺省为当前路径)mode:文件打开的状态返回值:成功为文件指针,失败为NULLFILE*fopen(constchar*path,constchar*mode)标准I/O---关闭文件(fclose)stream:已打开的文件指针返回值:成功为0,失败为EOFintfclose(FILE*stream)标准I/O---错误处理s:在标准错误流上输出的信息返回值:无voidperror(constchar*s);errnum:错误码返回值:错误码对应的错误信息char*strerror(interrnum);标准I/O---文件定位stream:需要定位的文件指针offset:相对于基准值的偏移量whence:基准值,SEEK_SET:文件起始位置SEEK_CUR:文件当前读写位置SEEK_END:文件结束位置返回值:成功为0,失败为EOF。intfseek(FILE*stream,longoffset,intwhence);标准I/O---文件定位stream:需要定位的文件指针返回值:成功为当前读写位置,失败为EOF。longftell(FILE*stream);标准I/O(指定大小进行读写)---文件读ptr:存放读入记录的缓冲区size:读取的记录大小nmemb:读取的记录数stream:要读取的文件流返回值:成功为返回实际读取到的nmemb数目
失败为EOF。size_tfread(void*ptr,size_tsize,size_tnmemb,FILE*stream)标准I/O(指定大小进行读写)---文件写ptr:存放写入记录的缓冲区size:写入的记录大小nmemb:写入的记录数stream:要写入的文件流返回值:成功为返回实际写入的nmemb数目
失败为EOF。size_tfwrite(void*ptr,size_tsize,size_tnmemb,FILE*stream)操作3.5:fread_fwrite.c标准I/O(按字符(字节)输入/输出)---文件读写stream:要输入的文件流返回值:成功为下一个字节
失败为EOF。intgetc(FILE*stream)intfgetc(FILE*stream)intgetchar(void)标准I/O(按字符(字节)输入/输出)---文件读写c:需要写的内容stream:要写入的文件流返回值:成功为字符
失败为EOF。intputc(intc,FILE*stream)intfputc(intc,FILE*stream)intputchar(intc)操作3.6:fgetc_fputc.c标准I/O(按行输入/输出)---文件读写s:要输出的字符串stream:对应的文件流返回值:成功为s;失败为NULL。intputs(constchar*s)intfputs(constchar*s,FILE*stream)操作3.7:fgets_fputs.cchar*gets(char*s)charfgets(char*s,intsize,FILE*stream)s:要输入的字符串size:输入的字符串长度stream:对应的文件流返回值:成功为s,失败为NULL。1、fopen、fclose、fread、fwrite、fseek、fgetc/fputc、fgets/fputs2、作业3、思政:
总结与作业THANKYOU!03PARTTHERE正大气象厚德载物MinnanUniversityofScienceandTechnologyS5P6818文件操作实例S5P6818显示图片---原理在Linux中,一切皆文件,LCD显示屏对应的设备文件为/dev/fb0。如果想让LCD显示屏显示颜色,就是把颜色写入到LCD显示屏对应的设备文件中,查看LCD设备文件相关信息。[root@GEC6818/IOT]#ls-l/dev/fb0crw-rw----1rootroot29,0Jan11970/dev/fb0颜色基于RGB模型,即红、绿、蓝,其范围是[0,255],每种颜色分量都占一个字节。LCD显示屏显示接收的颜色信息是aRGB,a为透明度,一般为0,总共4个字节,正好是int类型数据。如果要显示红色,可以定义一个变量等于0x00ff0000,绿色为0x0000ff00,蓝色为0x000000ff。10寸LCD显示屏的大小为1024*600,7寸LCD显示屏的大小为800*480,写入顺序是从左到右,从上到下。图片的格式有很多,比如bmp、png、gif、jpg等。bmp格式图片包含54字节的bmp格式的文件头和像素值,其像素值以BGR形式排列,每一个像素占有3字节。S5P6818显示图片操作3.8:bmp.c编译运行结果[root@GEC6818/IOT]#rxbmp[root@GEC6818/IOT]#
chmod777bmp[root@GEC6818/IOT]#./bmpcw@dell:/mnt/hgfs/share/day1_io$arm-none-linux-gnueabi-gccbmp.c-obmpS5P6818获取坐标值操作3.9:ts.c编译运行结果cw@dell:/mnt/hgfs/share/day1_io$arm-none-linux-gnueabi-gccts.c-ots[root@GEC6818/IOT]#rxts[root@GEC6818/IOT]#
chmod777ts[root@GEC6818/IOT]#./ts(132,418)[root@GEC6818/IOT]#./ts(103,519)1、编写程序实现自动播放显示图片,时间间隔可以设置为1s。2、编写程序实现点击LCD屏幕左边显示一张图片,点击右边显示另一张图片。作业嵌入式系统原理与应用第五章硬件平台正大气象厚德载物MinnanUniversityofScienceandTechnology硬件平台CONTENTS01.Cortex-A53处理器02.GEC6818开发平台简介03.通用I/O—点亮LED灯04.
外部中断05.UART串口通信正大气象厚德载物MinnanUniversityofScienceandTechnology01PARTONECortex-A53处理器正大气象厚德载物MinnanUniversityofScienceandTechnology正大气象厚德载物MinnanUniversityofScienceandTechnol
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生产流程再造之路
- 色彩魔法课堂
- 硕士之旅:理论探索与实践
- 增材制造与创新设计:从概念到产品 课件 第4、5章 增材制造前处理及工艺规划、增材制造后处理及经验总结
- 农业盛季财务透析
- 垃圾分类你我共建
- 迈向明日启航梦想
- 外汇质押合同(2篇)
- 2024深圳二手房购房定金及房屋维修保养服务合同3篇
- 标准格式离婚协议书
- 潜水员潜水作业安全2024
- 以案促改心得体会
- 2024年公文写作基础知识竞赛试题库及答案(共130题)
- 2023-2024学年浙江省丽水市莲都区教科版三年级上册期末考试科学试卷
- 失禁性皮炎病例护理查房课件
- 期末复习试题 (试卷)-2024-2025学年四年级上册数学人教版
- 2024年中国工业级硝酸铵市场调查研究报告
- 乡村振兴课件教学课件
- 2024年度危废物品转运服务协议版
- 2023年辅警招聘公安基础知识必刷题库及答案
- 《机加工操作员绩效考核方案》-企业管理
评论
0/150
提交评论