嵌入式linux笔记,嵌入式LINUX学习笔记

《嵌入式LINUX学习笔记》由会员分享,可在线阅读,更多相关《嵌入式LINUX学习笔记(40页珍藏版)》请在人人文库网上搜索。

1、过程。流程特征:动态性、并发性、独立性、异步性状态(三状态)进程ID :进程ID(PID ) :标识进程的唯一编号父进程的ID:(PPID )启动进程的用户ID(UID )进程互斥:如果某些进程使用共享资源,则始终有一个进程可用,使用该资源的其他进程必须等待该资源被释放。 (临界资源)临界资源:同时只允许一个流程,访问的资源称为临界资源临界区域:过程中访问临界资源的程序代码称为临界区域为了实现对临界资源的排他访问,必须确保各过程排他地进入各自的临界区域进程同步:一系列并行进程以一定顺序执行的进程是进程之间的同步。具有同步关系的一系列并行进程称为联合进程,在联合进程间发送信号称为信号或事件流程时。

2、间表:概念:以一定的算法,从要执行的进程组中选择一个来占用CPU的执行日程方式:带优先权,带非优先权调度算法:首先是服务调度算法短进程优先调度算法(执行时间短的优先)高优先级调度算法(数值越小优先级越高的LINUX上)时间切片轮换法(分时利用)死锁现象多个进程由竞争资源形成的僵硬局面,如果没有外力的作用,这些进程决不能前进。竞争资源预防是防止死锁的最好方法过程的控制程序设计#include#include获取pID_t getpid(void) /当前进程的idpID_t getppid(void) /获取父进程的id ) (返回进程ID int类型)创建进程fork ()#include创建。

3、pid_tofak(void)/子进程注意: fork函数一次调用两次并返回#include#includevoidmain(voidmain )举止pid_t pid;int count=0;pid=fork ();计数;打印ft ( count=% dn ,count );exit(0)以下执行结果: count=1 count=1分析:子进程的数据空间、堆栈空间从父进程而不是共享中获取副本。 子进程count 1不影响父进程count的值。 父进程的计数保持为0计数;prift(count=%n ,count );此程序分别在父子进程中独立运行。vfork ()创建子进程#include。

4、#includepid_t vfork(void )福克斯PK vfork差异: 1,fork子进程复制父进程的数据段vfork子进程共享父进程的数据段2、fork父代、子进程的执行顺序不明vfork子进程首先运行,在父进程之后运行#include#includePPS (PS )举止pid_t pid;int count=0;pid=vfork ();PS (PS=0)举止计数;prift(count=%n ,count );_exit(0)以下else if(pid0)计数;prift(count=%n ,count );exit(0)以下以下执行结果: count=1计数=2计数;pri。

5、ft(count=%n ,count );此程序:首先在子进程中运行count=1,然后在父进程中运行,调用vfork子进程来共享父进程的数据段,因此count再次增加1,count=2exec函数系列:exec用执行的程序替换调用的程序fork PK exec的差异:fork将创建新进程并生成新的PIDexec启动一个新程序,替换原始进程不会改变进程的PIDexec函数系列:头文件:#include函数名称函数的原型execlint execl (const char*path,const *arg1,)放弃int execlp(const char*path,const *arg1,)ex。

6、ecvint execv(const char*path,const *argv )说明:execl :int execl (const char*path,const *arg1,)参数: path可执行程序名称(包括完整路径)arg1argn是运行程序所需的命令行参数,包括函数名称,以空指针(NULL )结束PS :execl(/bin/ls , ls ,-al ,/etc/passwd ,(char*)0;命令行:相当于ls-al/etc/passwdexeclp:int execlp (const char * path,const *arg1,)参数: path可执行程序名称(不包含。

7、完整路径,从path环境变量中查找程序)arg1argn是运行程序所需的命令行参数,包括函数名称,以空指针(NULL )结束PS :执行( ls , ls ,-al ,/etc /密码,(char*)0);命令行:相当于ls-al/etc/passwdexecv :int execv (const char*path,const *argv )参数: path可执行程序名称,包括完整路径argv是执行程序所需的命令行参数组PS :char *argv=ls ,-al ,/etc/passwd ,(char*)0;execv(/bin/ls ,argv )命令行:相当于ls-al/etc/pas。

8、swdsystem函数#includeint system(const char*string )生成一个新的子进程功能:调用fork函数,生成执行参数string表示的命令的子进程。 子进程调用/bin/sh-cstringsystem(ls-al/etc/passwd )相当于命令行: ls-al/etc/passwd进程等待:#include#includepid_t wait (int *status )功能:阻止此进程,等待其子进程(任意)结束返回子进程的PID#include#include#include#include#includevoid main ()举止pid_t pc。

9、,pr;电脑=福克()PS (K=0)举止printf ( thisischildprocesswithof % d/n ,getpid ();休眠(10 )以下else if (pc=0)举止PC=wait (空)printf ( icatchedachildaprocesswithpidof % dn ,pr );以下exit(0)以下进程间的通信目的:1 .数据传输:一个进程需要将数据发送到另一个进程2 .资源共享:在多个进程之间共享相同的资源3、通知事件:一个流程必须向另一个流程或一系列流程发送信息通知4、过程控制:一些过程想完全控制另一个过程的执行(调试过程)。 此时,控制过程希望切。

10、断其他过程的全部操作,并立即知道其状态的变化。Linux处理机制:unix进程之间的通信基于系统v进程之间的通信Posix进程间的通信(portableoperatingsysteminterface )方法:1 .管道和有名的管道(FIFO )。2、信号(singal )3 .信息队列4 .共享内存5、信号量6 .插座(插座)管子(管子)Pipe:是单向的和先进的,其中一个进程的输出与另一个进程的输入耦合,一个进程(写入进程)将数据写入管道的末尾,而另一个进程(读取进程)从管道的开头读取数据总结:从头写,从头读在数据已经被一个过程读取之后,将数据从管道中删除,而其他读取过程就不能读取这些数据。

11、,从而提供了一种简单的流控制机制,当该过程尝试读取空管道时,该过程被阻塞,而相同的管道Pipe :无名管道:父子进程之间的通信有名的管道:任意两个进程之间的通信创建无名管道: pipe ()函数int pipe(int filedis2 )已经创建了两个文件描述符: filedis 0和filedis1filedis 0用于读取pipe的头部filedis 1写在pipe的末尾关闭管道:使用close ()函数一次关闭两个文件描述符关闭(文件is 0 );关闭(文件is 1 );pipe读写:管线用于不同进程的通信通常是先创建管线,然后使用fork ()函数创建子进程,子进程会继承父进程创建的。

12、管线注意:在系统调用fork ()之前,必须调用pipe ()。 否则,子进程将不会继承相应的文件描述符示例:命名管道FIFO命名管道与未命名管道基本相同,但未命名管道只能在父子进程中使用,但命名管道允许在不相关的进程之间交换数据。创建:#include#includeint mkfifo(const char*pathname,mode_t mode )pathname :FIFO的文件名模式:属性(中间文件操作)创建FIFO后,可以在open ()中打开,并可以在FIFO中使用通用文件访问函数(如close read write )。打开FIFO的非阻塞标志(O_NONBLOCK )后,会。

13、对以后的读写产生以下影响第一,如果没有满足O_NONBLOCK接入请求,则将阻止该过程,并且该过程试图读取空FIFO2、如果使用O_NONBLOCK的访问请求不满足,则不被块地立即错误返回:errno=ENXIO信号通信信号处理方式:1 .无视这个信号不处理任何信号,但不能忽略SIGKILL和SIGSTOP这两个信号。SIGKILL用于结束进程的执行。 因为不与其他信号通信,所以不能被阻塞、忽略或捕捉信号。 此信号通常用于root用户或其他系统管理员退出不能用其他退出信号退出的进程SIGSTOP :停止进程的执行,该进程没有结束,但处于停止状态。 不能阻塞、无视和捕捉信号。2 .执行用户希望的。

14、动作如果内核发生了任何信号,则调用用户函数,以通过用户函数通知用户要执行所需的操作。3 .执行系统的默认操作在大多数信号系统的默认情况下,操作结束进程。信号的发送发送信号的主要函数是kill ()、raise ()差异:kill ()可以向本进程发送信号,也可以向其他进程发送信号raise ()仅向该进程发送信号函数的原型#include#includeint kill(pid_t pid,int signo )int raise(int signo )kill ()的pid参数的四种情况:1、pID0向进程id为pid的进程发送信号2、将pid=0信号发送到同一组的进程3、pid0向该进程组。

15、ID=|pid|的绝对值的进程发送信号4、pid=-1向所有进程发送信号alarm ()如果使用alarm ()函数,则在时间值(报警时间)达到设定的时间时生成SIGALRM信号,如果未捕获信号,则默认动作结束进程#includeunsignedinteralarm (unsignedinterseconds )seconds :秒。 经过指定的seconds秒后,将生成信号SIGALRMpause ()pause ()函数调用过程会挂起,直到捕捉到信号为止#includeint pause(void )通常可以用于判断信号是否已经到来。信号的处理如果系统不相互捕捉信号,可以忽略信号,使用指定。

16、的处理函数处理信号,或使用系统的默认方法信号处理的两种主要方法1 .使用简单的signal函数2 .使用信号集函数组signal ()函数头文件#include函数的原型void (*信号,void (*func)(int) (int )函数的赋值signum :指定信号代码funcSIG_IGN :无视该信号SIG_DFL :采用系统的默认处理方法自定义信号处理函数指针函数返回值成功:以前的信号处理配置错误:-1理解:typedef void (*sighandler_t)(int )sighandler_t signal (int signum,sighandler_t handler )#include#include#includevoid my_func(int sign_no )举止if(sign_no=SIGINT。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值