嵌入式LINUX_C基础09_第1页
嵌入式LINUX_C基础09_第2页
嵌入式LINUX_C基础09_第3页
嵌入式LINUX_C基础09_第4页
嵌入式LINUX_C基础09_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ESD_DAY031_ElvisUNIX/LINUX 系统下的C高级编程A.N.E.K1.目录的管理1.1 使用opendir函数打开目录使用时引入头文件sys/stat.h,dirent.h功能:打开参数指定的目录。格式:DIR* opendir(const char*name);注意:一个参数:想打开的目录路径,双引号括起来;多级路径可能需要sprintf函数拼接。返回值:成功返回目录指针,失败返回NULL。1.2 使用readdir函数读取目录使用时引入头文件dirent.h功能:读取参数指定目录中的内容。格式:struct dirent* readdir(DIR*dirp);注意:一个

2、参数:目录指针,函数opendir()的返回值;返回值:成功返回结构体指针,失败返回NULL。struct dirent . . . unsigned char d_type; /文件的类型 char d_name256;/文件的名称. . . ;1.3 使用closedir函数关闭目录使用时引入头文件dirent.h功能:关闭参数指定的目录。格式:int closedir(DIR*dirp);注意:一个参数:目录指针,函数opendir()的返回值;返回值:成功返回0,失败返回-1。*目录的基本操作*#include<stdio.h>#include<stdlib.h>

3、;#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<dirent.h>int main() /1.打开目录 DIR*dir=opendir("./day09"); if(NULL=dir) perror("opendir"); exit(-1); printf("打开目录成功n"); /2.遍历目录中的内容 struct dirent*ent;/=readdir(dir); /while(NULL!=e

4、nt) while(ent=readdir(dir) /打印读取到的类型和文件名 /4->目录,8->文件 printf("%d,%sn",ent->d_type,ent->d_name); /读取下一个 /ent=readdir(dir); /3.关闭目录 int res=closedir(dir); if(-1=res) perror("closedir"); exit(-1); printf("成功关闭目录n"); return 0;*练习:编程实现打印指定目录中的所有内容,要求子目录中的内容也要打印出来

5、*#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<dirent.h>#include<string.h>void print(char*path);int main() print("./day02"); return 0;void print(char*path) /1.打开目录 DIR*dir=opendir(path); if(NULL=dir) perror("op

6、endir"); return; printf("目录打开成功n"); /2循环读取目录中的内容 struct dirent*ent; while(ent=readdir(dir) /2.1如果读取到目录,则打印再递归 if(4=ent->d_type) printf("%sn",ent->d_name); /特殊处理特殊目录.和. if(!strcmp(ent->d_name,".")|!strcmp(ent->d_name,".") continue; /拼接新的路径 char

7、 buf100=0; sprintf(buf,"%s/%s",path,ent->d_name); /调用递归子目录中的内容 print(buf); /2.2如果读取到文件,则直接打印 if(8=ent->d_type) printf("%sn",ent->d_name); int res=closedir(dir); if(-1=res) perror("closedir"); exit(-1); printf("成功关闭文件n");1.4 其他相关的函数mkdir()-创建一个目录rmdir(

8、)-删除一个目录chdir()-改变目录getcwd()-获取当前进程所在目录,get current working directory。2.进程管理2.1 基本概念和基本命令(1)基本概念程序就是存放在磁盘上的一个可执行文件,进程就是指运行在内存中的程序。同一个程序可以启动多个进程。(2)基本命令ps-查看当前终端中启动的进程(进程的快照)。ps命令的执行结果:PID-进程号;TTY-终端的次要装置号码(了解);TIME-命令占用CPU的时间(了解);CMD-命令的名称;ps -aux-表示显示所有包含其他使用者的进程;ps -aux|more-分屏显示所有的进程;”|”表示管道,即ps-

9、aux命令的结果通过一个管道存放到more中;进程的状态:S:休眠状态,以减轻CPU的压力;s:进程的领导者,旗下有子进程;Z:僵尸进程,已经结束的进程,但是资源没有回收;R:正在运行的进程;O:可以运行的进程,T:挂起状态的进程,现场保护;<:优先级较高的进程;N;优先级较低的进程ps -ef-表示以全格式的方式显示进程的信息;ps -ef|more-表示分屏显示进程的信息UID-用户的编号;PID-进程的编号;PPID-父进程的编号;C-占用的CPU百分比;STIME-进程的开始时间;TTY-终端号;TIME-消耗CPU的时间;CMD-进程的名称如果进程A启动了进程B,那么进程A就叫

10、做进程B的父进程,进程B叫做进程A的子进程,目前主流的操作系统都是支持多进程的。系统中进程0是系统的内部的进程,负责启动进程1(init)和进程2,其他所有进程都是直接/简介由进程1和进程2启动起来的,从而形成了一个树形结构。kill -9-表示杀死指定的进程2.2 各种ID的获取PID-进程的编号,系统采用进程的编号来唯一标识一个进程,采用延迟重用的策略进行管理,在任意时刻都保证进程号是唯一的。getpid()-获取当前进程的进程号;getppid()-获取当前进程的父进程的进程号;getuid()-获取用户的编号;getgid()-获取用户组的编号;其中进程号的数据类型是pid_t,本质是

11、int类型,但是一般都是从0开始使用;用户ID的数据类型是uid_t,本质上是unsigned int型;用户组ID的数据类型是gid_t,本质上是unsigned int类型。2.3 进程的创建(1)fork函数使用时引入头文件unistd.h功能:以复制正在调用进程的方式来创建新进程,其中正在调用的进程叫做父进程,创建出来的新进程叫做子进程。格式:pid_t fork();注意:无参数;返回值:成功调用时在父进程中返回子进程的进程号,子进程返回0,失败调用失败时父进程返回-1,子进程没有被创建出来。/使用fork函数创建子进程#include<stdio.h>#include&

12、lt;stdlib.h>#include<unistd.h>#include<sys/types.h>int main() printf("main函数开始执行n");/执行一次 /使用fork函数创建子进程 pid_t pid=fork(); if(-1=pid) perror("fork"); exit(-1); /printf("main函数结束n,%d",pid);/执行两次 /分辨子进程 if(0=pid) printf("我是子进程,我的进程号是:%d,我的父进程是:%dn"

13、;,getpid(),getppid(); sleep(3); printf("我是子进程,我的进程号是:%d,我的父进程是:%dn",getpid(),getppid();/此时,这里的父进程已经是init,其进程号是1 else sleep(1); printf("我是父进程,我的进程号是%d,我的子进程号是:%dn",getpid(),pid); return 0;(2)使用fork函数创建的子进程的执行方式a.对于fork函数之前的代码,父进程执行一次;b.对于fork函数之后的代码,父子进程各执行一次;连同fork()函数的一部分也再执行1次,

14、因此会有两个返回值。c.对于fork函数的返回值来说,父子进程各返回一次,父进程返回子进程的ID,子进程返回0;因此可以通过函数的返回值来区分父子进程。(3)父子进程之间的关系a.父进程启动子进程,父子进程同时工作,如果子进程结束,则会给父进程发信号SIGCHLD,由父进程帮助其回收资源;b.如果父进程先结束,则子进程会变成孤儿进程,子进程会变更父进程(重新设定父进程,init(1)进程),init进程叫做孤儿院;c.如果子进程先结束,但是父进程由于各种原因没有收到子进程发来的信号,也就没有帮助子进程回收资源,则子进程就会变成僵尸进程;注意:使用fork函数创建子进程后,父子进程的执行顺序由操

15、作系统调度。(4)父子进程之间的内存资源关系*观察父子进程之间的内存关系*#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/types.h>int i1=1;/全局变量,全局区int main() int i2=1;/局部变量,栈区 /pc指向堆区,pc本身在栈区 char*pc=(char*)malloc(sizeof(char)*10); strcpy(pc,"hello"); /使用fork函

16、数创建子进程 pid_t pid=fork(); if(-1=pid) perror("fork"); exit(-1); /子进程 if(0=pid) i1=2; i2=2; strcpy(pc,"HELLO"); printf("子进程中:i1=%d,i2=%d,pc=%sn",i1,i2,pc); exit(0);/终止子进程 sleep(1);/保证子进程先结束 printf("父进程中:i1=%d,i2=%d,pc=%sn",i1,i2,pc); return 0;/父子进程打印的结果不一样,说明实际内存

17、并没有共享可见,对于fork函数创建的子进程来说,复制父进程中除了代码区之外的其他内存区域,代码区和父进程共享。(5)扩展a.如何创建3个进程,一共4个进程:连续调用两次fork函数,4个进程:1个父进程+2个子进程+1个孙进程。以指数级增长。b.如何创建2个子进程,一共3个进程:pid=fork();if(pid!=0) fork();/在父进程中单独调用,1个进程+2个子进程;c.俗称:fork炸弹while(1) fork();2.4 进程的终止(1)进程的正常终止方式a.在main函数中执行了return 0表示正常结束;b.调用exit(0)函数;c.调用_exit(0)/_Exit

18、(0)函数来终止进程d.最后一个线程返回;e.最后一个线程调用了pthread_exit函数(2)进程的异常终止方式a.采用信号来终止进程;b.最后一个线程被其他线程调用pthread_cancle取消(3)相关函数的解析_exit()/_Exit()函数:功能:立即终止当前正在运行的进程。格式:#include <unistd.h> void _exit(int status); #include <stdlib.h> void _Exit(int status);注意:_exit()和_Exit()函数功能上完全相同;在终止进程时,会自动关闭属于该进程的文件描述符,

19、会给该进程的父进程发送SIGCHLD信号,该进程的所有子进程会重新认定新的父进程为init;参数值会被返回给父进程作为该进程终止时的退出状态信息,父进程需要调用wait系列函数来获取该数据。返回值:无返回值exit()函数:功能:引起正常进程的终止。格式:#include <stdlib.h> void exit(int status);注意:将参数status&0377之后的数据返回给当前进程的父进程 自动调用所有被atexit()和on_exit()函数注册过的函数,一般用于处理善后工作。返回值:无返回值atexit()函数:功能:对参数指定的函数进程注册。格式:#in

20、clude <stdlib.h> int atexit(void(*function)(void);注意:所有被该函数注册过的函数会在正常终止时被调用,而正常进程终止的主要方式为:调用exit函数和执行main函数中的return。返回值:成功返回0,失败返回非零。*使用不同的函数终止进程*#include<stdio.h>#include<stdlib.h>#include<unistd.h>void show(void)/当执行到return时调用此函数 printf("Komachi wa tsuyoin");int main() /调用atexit函数进行注册,但不会调用函数 int res=atexit(show);/注册show函数 if(0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论