Linux系统编程介绍.ppt

上传人:hyn****60 文档编号:70679661 上传时间:2023-01-24 格式:PPT 页数:172 大小:1.21MB
返回 下载 相关 举报
Linux系统编程介绍.ppt_第1页
第1页 / 共172页
Linux系统编程介绍.ppt_第2页
第2页 / 共172页
点击查看更多>>
资源描述

《Linux系统编程介绍.ppt》由会员分享,可在线阅读,更多相关《Linux系统编程介绍.ppt(172页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Linux系统编程介绍系统编程介绍第三章第三章1本章目标本章目标系统编程与应用编程系统资源系统调用系统调用与C库关系错误处理2系统编程与应用编程系统编程与应用编程系统编程 在操作系统之上利用系统调用、C库进行对系统资源进行访问。如apache、gcc、gdb 等应用编程 在更高层次的编程接口或者库之上构建应用程序。如android程序(android sdk)、iphone程序(iphone sdk)、QT程序设计(QT)MFC程序设计(MFC)等。3系统资源系统资源处理器输入输出进程管理内存设备定时器进程间通信网络4系统调用在系统中所处的位置系统调用在系统中所处的位置所有操作系统都提供多种服

2、务的入口点,由此程序向系统核请求服务。这些入口点被称之为系统调用(system call),5C C库库这里我们所说的C库(libc),指的是标准C定义的函数的集合。如标准输入输出函数、字符串处理函数、动态存储分配函数、日期时间函数、数学函数等。GNU发布的libc称为glibc6系统调用与系统调用与C C库关系库关系系统调用与库从形式上来看都C函数C库函数有些是调用系统调用来实现的,比如说malloc、free调用brk,printf调用write系统用,有些函数不需要任何系统调用,比如abs、strcpy、atoi等,因为它并不是必需要使用内核服务系统调用通常提供的是最小界面,而库函数通常

3、提供更复杂的功能。7内核如何处理系统调用内核如何处理系统调用每个系统调用被赋予一个系统调用号在i386平台上,执行一个系统调用是通过int 0 x80指令完成的。eax存放系统调用号ebx、ecx、edx、esi、edi存储系统调用参数,对于超过5个参数的系统调用,用一个寄存器指向用户空间存储所有系统调用参数的缓存。8错误处理错误处理在系统编程中错误通常通过函数返回值来表示,并通过特殊变量errno来描述。errno这个全局变量在头文件中声明如下:extern int errno;错误处理函数perrorstrerror9错误代码错误代码E2BIG参数列表太长EACCESS权限不足EAGAIN

4、重试EBADF错误的文件描述符EBUSY设备或资源忙ECHILD无子进程EDOM数学参数不在函数域内EEXIST文件已存在EFAULT地址错误EFBIG文件太大EINTR系统调用被中断.10文件与文件与I/O(一)(一)第四章第四章11本章目标本章目标什么是I/O文件描述符文件系统调用12什么是什么是I/OI/O输入/输出是主存和外部设备之间拷贝数据的过程设备-内存(输入操作)内存-设备(输出操作)高级I/OANSI C提供的标准I/O库称为高级I/O,通常也称为带缓冲的I/O低级I/O通常也称为不带缓冲的I/O13文件描述符文件描述符对于Linux而言,所有对设备或文件的操作都是通过文件描述

5、符进行的。当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数)。后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息。一个进程启动时,默认打开了3个文件,标准输入、标准输出、标准错误,对应文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),这些常量定义在unistd.h头文件中。14文件描述符与文件指针转换文件描述符与文件指针转换fileno:将文件指针转换为文件描述符fdopen:将文件描述符转换为文件指针15文件系统调用文件系统调用open系统调用close系统调用creat系统调用read系统调

6、用write系统调用16open系统调用系统调用2-1有几种方法可以获得允许访问文件的文件描述符。最常用的是使用open()(打开)系统调用函数原型int open(const char*path,int flags);参数path:文件的名称,可以包含(绝对和相对)路径flags:文件打开模式返回值打开成功,返回文件描述符;打开失败,返回1open系统调用系统调用2-2函数原型int open(const char*path,int flags,mode_t mode);参数path:文件的名称,可以包含(绝对和相对)路径flags:文件打开模式mode:用来规定对该文件的所有者,文件的用户

7、组及系 统中其他用户的访问权限返回值打开成功,返回文件描述符;打开失败,返回1打开文件的方式打开文件的方式打开方式描述O_RDONLY打开一个供读取的文件O_WRONLY打开一个供写入的文件O_RDWR打开一个可供读写的文件O_APPEND写入的所有数据将被追加到文件的末尾O_CREAT打开文件,如果文件不存在则建立文件O_EXCL如果已经置O_CREAT且文件存在,则强制open()失败O_TRUNC在open()时,将文件的内容清空所有这些标志值的符号名称可以通过所有这些标志值的符号名称可以通过#include 访问访问访问权限访问权限打开方式描述S_IRUSR文件所有者的读权限位S_IW

8、USR文件所有者的写权限位S_IXUSR文件所有者的执行权限位S_IRWXUS_IRUSR|S_IWUSR|S_IXUSRS_IRGRP文件用户组的读权限位S_IWGRP文件用户组的写权限位S_IXGRP文件用户组的执行权限位S_IRWXGS_IRGRP|S_IWGRP|S_IXGRPS_IROTH文件其他用户的读权限位S_IWOTH文件其他用户的写权限位S_IXOTH文件其他用户的执行权限位S_IRWXOS_IROTH|S_IWOTH|S_IXOTHopen调用的几点说明调用的几点说明可以利用按位逻辑加(bitwise-OR)(|)对打开方式的标志值进行组合。如打开一个新文件:如打开一个新文

9、件:define NEWFILE(O_WRONLY|O_CREAT|O_TRUNC)对访问权限位进行访问所用到的标识符,均可以通过include 访问到,同样可以通过|运算来对访问权限进行组合#define MODE755 (S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)close系统调用系统调用为了重新利用文件描述符,用close()系统调用释放打开的文件描述符 函数原型:int close(int fd);函数参数:-fd:要关闭的文件的文件描述符返回值如果出现错误,返回-1调用成功返回0creat系统调用系统调用2-1为了维持与早期的UNIX系统的向后兼

10、容性,Linux也提供可选的创建文件的系统调用,它称为creat()。函数原型:int creat(const char*path,mode_t mode);参数path:文件的名称,可以包含(绝对和相对)路径mode:用来规定对该文件的所有者,文件的用户组及系 统中其他用户的访问权限返回值打开成功,返回文件描述符;打开失败,返回1creat系统调用系统调用(2-2)在UNIX的早期版本中,open()系统调用仅仅存在两个参数的形式。如文件不存在,它就不能打开这些文件。文件的创建则由单独的系统调用creat()完成。在Linux及所有UNIX的近代版本中,creat()系统调用是多余的。cre

11、at()调用用fd=creat(file,mode);完全等价于近代的完全等价于近代的open()调用用fd=open(file,O_WRONLY|O_CREAT|O_TRUNC,mode);read系统调用系统调用一旦有了与一个打开文件描述相连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节 函数原型:ssize_t read(int fd,void*buf,size_t count);参数fd:想要读的文件的文件描述符buf:指向内存块的指针,从文件中读取来的字节放到这个内存块中count:从该文件复制到buf中的字节个数

12、返回值如果出现错误,返回-1读文件结束,返回0否则返回从该文件复制到规定的缓冲区中的字节数write系统调用系统调用用write()系统调用将数据写到一个文件中 函数原型:ssize_t write(int fd,const void*buf,size_t count);函数参数:-fd:要写入的文件的文件描述符-buf:指向内存块的指针,从这个内存块中读取数据写入 到文件中-count:要写入文件的字节个数返回值如果出现错误,返回-1如果写入成功,则返回写入到文件中的字节个数文件与文件与I/O(二)(二)第五章第五章27本章目标本章目标read、writelseek目录访问(opendir、

13、readdir、closedir)rmdir、mkdirchmod、fchmodchown、fchown28read系统调用系统调用一旦有了与一个打开文件描述相连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节 函数原型:ssize_t read(int fd,void*buf,size_t count);参数fd:想要读的文件的文件描述符buf:指向内存块的指针,从文件中读取来的字节放到这个内存块中count:从该文件复制到buf中的字节个数返回值如果出现错误,返回-1读文件结束,返回0否则返回从该文件复制到规定的缓冲区中的

14、字节数write系统调用系统调用用write()系统调用将数据写到一个文件中 函数原型:ssize_t write(int fd,const void*buf,size_t count);函数参数:-fd:要写入的文件的文件描述符-buf:指向内存块的指针,从这个内存块中读取数据写入 到文件中-count:要写入文件的字节个数返回值如果出现错误,返回-1如果写入成功,则返回写入到文件中的字节个数文件的随机读写文件的随机读写到目前为止的所有文件访问都是顺序访问。这是因为所有的读和写都从当前文件的偏移位置开始,然后文件偏移值自动地增加到刚好超出读或写结束时的位置,使它为下一次访问作好准备。有个文件

15、偏移这样的机制,在Linux系统中,随机访问就变得很简单,你所需做的只是将当前文件移值改变到有关的位置,它将迫使一次read()或write()发生在这一位置。(除非文件被O_APPEND打开,在这种情况下,任何write调用仍将发生在文件结束处)lseek系统调用系统调用 1功能说明:功能说明:通过指定相对于开始位置、当前位置或末尾位置通过指定相对于开始位置、当前位置或末尾位置的字节数来重定位的字节数来重定位 curp,这取决于,这取决于 lseek()函数中指定的函数中指定的位置位置原型:原型:off_t lseek(int fd,off_t offset,int base);需设置的文件

16、标识符需设置的文件标识符偏移量偏移量搜索的起始位置搜索的起始位置返回值:返回新的文件偏移值返回值:返回新的文件偏移值lseek系统调用系统调用 2base 表示搜索的起始位置,有以下几个值:(这些值定义在)base文件位置文件位置SEEK_SET 从文件开始处计算偏移SEEK_CUR 从当前文件的偏移值计算偏移SEEK_END 从文件的结束处计算偏移目录访问目录访问 31功能说明:打开一个目录功能说明:打开一个目录原型:原型:DIR*opendir(char*pathname);返回值:返回值:打开成功,返回一个目录指针打开成功,返回一个目录指针打开失败,则返回打开失败,则返回0文件的路径名文

17、件的路径名目录访问目录访问 32功能说明:功能说明:访问指定目录中下一个连接的细节访问指定目录中下一个连接的细节原型:原型:struct dirent*readdir(DIR *dirptr);返回值:返回值:返回一个指向返回一个指向dirent结构的指针,它包含指定目录中下一个连结构的指针,它包含指定目录中下一个连接的细节;接的细节;没有更多连接时,返回没有更多连接时,返回0目录指针目录指针目录访问目录访问 33功能说明:功能说明:关闭一个已经打开的目录关闭一个已经打开的目录原型:原型:int closedir(DIR *dirptr);返回值:调用成功返回返回值:调用成功返回0,失败返回,

18、失败返回-1目录指针目录指针目录信息结构体目录信息结构体 struct dirent long d_ino;/*inode number*/off_t d_off;/*offset to this dirent*/unsigned short d_reclen;/*length of this d_name*/char d_name NAME_MAX+1;/*file name(null-terminated)*/mkdir系统调用系统调用 功能说明:功能说明:用来创建一个称为用来创建一个称为pathname的新目录,的新目录,它的权限位设置为它的权限位设置为mode原型:原型:int mkd

19、ir(char*pathname,mode_t mode);返回值:调用成功返回返回值:调用成功返回0,失败返回,失败返回-1文件的路径名文件的路径名权限位权限位rmdir系统调用系统调用 功能说明:功能说明:删除一个空目录删除一个空目录原型:原型:int rmdir(char*pathname);返回值:调用成功返回返回值:调用成功返回0,失败返回,失败返回-1文件的路径名文件的路径名chmod和和fchmod系统调用系统调用 功能说明:功能说明:用来改变给定路径名用来改变给定路径名pathname的文件的文件的权限位的权限位原型:原型:int chmod(char*pathname,mod

20、e_t mode);文件的路径名文件的路径名权限位权限位返回值:调用成功返回返回值:调用成功返回0,失败返回,失败返回-1int fchmod(int fd,mode_t mode);文件描述符文件描述符权限位权限位chown和和fchown系统调用系统调用 功能说明:功能说明:用来改变文件所有者的识别号用来改变文件所有者的识别号(owner id)或者它的用户组识别号或者它的用户组识别号(group ID)原型:原型:int chown(char*pathname,uid_t owner,gid_t group);文件的路径名文件的路径名所有者识别号所有者识别号返回值:调用成功返回返回值:调

21、用成功返回0,失败返回,失败返回-1int fchown(int fd,uid_t owner,gid_t group);文件描述符文件描述符用户组识别号用户组识别号所有者识别号所有者识别号用户组识别号用户组识别号文件与文件与I/O(三)(三)第六章第六章42本章目标本章目标statstat结构体stat示例43statstat功能:读取文件元数据44int stat(const char*path,struct stat*buf);int stat(const char*path,struct stat*buf);int fstat(int fd,struct stat*buf);int f

22、stat(int fd,struct stat*buf);int lstat(const char*path,struct stat*buf);int lstat(const char*path,struct stat*buf);stat结构体结构体struct stat dev_t st_dev;/*ID of device containing file*/ino_t st_ino;/*inode number*/mode_t st_mode;/*protection*/nlink_t st_nlink;/*number of hard links*/uid_t st_uid;/*user

23、 ID of owner*/gid_t st_gid;/*group ID of owner*/dev_t st_rdev;/*device ID(if special file)*/off_t st_size;/*total size,in bytes*/blksize_t st_blksize;/*blocksize for file system I/O*/blkcnt_t st_blocks;/*number of 512B blocks allocated*/time_t st_atime;/*time of last access*/time_t st_mtime;/*time o

24、f last modification*/time_t st_ctime;/*time of last status change*/;45课后作业课后作业实现ls-l功能lstatgetpwuidgetgrgidreadlink46文件与文件与I/O(四)(四)第七章第七章47本章目标本章目标文件共享打开文件内核数据结构一个进程两次打开同一个文件两个进程打开同一个文件复制文件描述符(dup、dup2、fcntl)48文件共享(文件共享(3 31 1)49文件状态标志:文件状态标志:读、写、追加、同步、非阻塞等读、写、追加、同步、非阻塞等文件共享(文件共享(3 32 2)50文件共享(文件共享

25、(3 33 3)51复制文件描述符复制文件描述符52执行执行dup(3)dup(3)前后前后复制文件描述符复制文件描述符复制文件描述符有三种方法dupdup2fcntlfcntl(fd,F_DUPFD,fd_start);53文件与文件与I/O(五)(五)第八章第八章54本章目标本章目标fcntl函数fcntl常用操作文件锁55fcntlfcntl功能:操纵文件描述符,改变已打开的文件的属性56int fcntl(int fd,int cmd,./*arg*/);int fcntl(int fd,int cmd,./*arg*/);fcntl常用操作常用操作复制文件描述符F_DUPFD(lon

26、g)文件描述符标志F_GETFD(void)F_SETFD(long)文件状态标志F_GETFL(void)F_SETFL(long)文件锁F_GETLKF_SETLK,F_SETLKW57文件锁结构体文件锁结构体struct flock.short l_type;/*Type of lock:F_RDLCK,F_WRLCK,F_UNLCK*/short l_whence;/*How to interpret l_start:SEEK_SET,SEEK_CUR,SEEK_END*/off_t l_start;/*Starting offset for lock*/off_t l_len;/*N

27、umber of bytes to lock*/pid_t l_pid;/*PID of process blocking our lock (F_GETLK only)*/.;58进程(一)进程(一)第九章第九章59本章目标本章目标什么是程序什么是进程进程数据结构进程与程序区别与联系60程序是完成特定任务的一系列指令集合。什么是程序什么是程序从用户的角度来看进程是程序的一次执行过程从操作系统的核心来看,进程是操作系统分配的内存、CPU时间片等资源的基本单位。进程是资源分配的最小单位每一个进程都有自己独立的地址空间与执行状态。像UNIX这样的多任务操作系统能够让许多程序同时运行,每一个运行着的

28、程序就构成了一个进程什么是进程什么是进程代码段数据段堆栈段PCB我们进程的静态描述:由三部分组成:PCB、有关程序段和该程序段对其进行操作的数据结构集。进程控制块:用于描述进程情况及控制进程运行所需的全部信息。代码段:是进程中能被进程调度程序在CPU上执行的程序代码段。数据段:一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行后产生的中间或最终数据进程数据结构进程数据结构进程是动态的,程序是静态的进程的生命周期是相对短暂的,而程序是永久的。进程数据结构PCB一个进程只能对应一个程序,一个程序可以对应多个进程。进程与程序进程与程序进程(二)进程(二)第十章第十章65本章目

29、标本章目标进程状态变迁进程控制块进程创建进程撤消终止进程的五种方法66就绪等待运行进程状态变迁进程状态变迁进程状态变迁进程状态变迁运行状态(TASK_RUNNING)可中断睡眠状态(TASK_INTERRUPTIBLE)不可中断睡眠状态(TASK_UNINTERRUPTIBLE)暂停状态(TASK_STOPPED)僵死状态(TASK_ZOMBIE)进程状态变迁进程状态变迁进程描述信息进程标识符用于唯一的标识一个进程。进程控制信息进程当前状态进程优先级程序开始地址各种计时信息通信信息资源信息占用内存大小及管理用数据结构指针交换区相关信息I/O设备号、缓冲、设备相关的数结构文件系统相关指针现场保护

30、信息寄存器PC程序状态字PSW栈指针进程控制块进程控制块每个进程都会分配到一个独一无二的数字编号,我们称之为“进程标识”(process identifier),或者就直接叫它PID.是一个正整数,取值范围从2到32768当一个进程被启动时,它会顺序挑选下一个未使用的编号数字做为自己的PID数字1一般为特殊进程init保留的进程标识进程标识不同的操作系统所提供的进程创建原语的名称和格式不尽相同,但执行创建进程原语后,操作系统所做的工作却大致相同,都包括以下几点:给新创建的进程分配一个内部标识,在内核中建立进程结构。复制父进程的环境为进程分配资源,包括进程映像所需要的所有元素(程序、数据、用户栈

31、等),复制父进程地址空间的内容到该进程地址空间中。置该进程的状态为就绪,插入就绪队列。进程创建进程创建进程终止时操作系统做以下工作:关关闭软中断中断:因为进程即将终止而不再处理任何软中断信号;回回收收资源源:释放进程分配的所有资源,如关闭所有已打开文件,释放进程相应的数据结构等;写写记帐信信息息:将进程在运行过程中所产生的记帐数据(其中包括进程运行时的各种统计信息)记录到一个全局记帐文件中;置置该进程程为僵僵死死状状态:向父进程发送子进程死的软中断信号,将终止信息status送到指定的存储单元中;转进程程调度度:因为此时CPU已经被释放,需要由进程调度进行CPU再分配。进程撤消进程撤消从mai

32、n函数返回调用exit调用_exit调用abort由信号终止终止进程的五种方法终止进程的五种方法进程(三)进程(三)第十一章第十一章75本章目标本章目标复制进程映像fork系统调用孤儿进程、僵尸进程写时复制76 使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。子进程与父进程的区别在于:1、父进程设置的锁,子进程不继承2、各自的进程ID和父进程ID不同3、子进程的未决告警被清除;4、子进程的未决信号集设置为空集。复制一个进程映象复制一个进程映象f

33、ork包含头文件 和 函数功能:创建一个子进程函数原型 pid_t fork(void);参数:无参数。返回值:如果成功创建一个子进程,对于父进程来说返回子进程ID如果成功创建一个子进程,对于子进程来说返回值为0如果为-1表示创建失败fork 系统调用系统调用fork 系统调用系统调用fork系统调用之后,父子进程将交替执行。如果父进程先退出,子进程还没退出那么子进程的父进程将变为init进程。(注:任何一个进程都必须有父进程)如果子进程先退出,父进程还没退出,那么子进程必须等到父进程捕获到了子进程的退出状态才真正结束,否则这个时候子进程就成为僵进程。fork 系统调用注意点系统调用注意点如果

34、多个进程要读取它们自己的那部分资源的副本,那么复制是不必要的。每个进程只要保存一个指向这个资源的指针就可以了。如果一个进程要修改自己的那份资源的“副本”,那么就会复制那份资源。这就是写时复制的含义写时复制写时复制copy on write进程(四)进程(四)第十二章第十二章82本章目标本章目标fork之后父子进程共享文件fork与vforkexit与_exitatexitexecve替换进程映像(加载程序)83forkfork之后父子进程共享文件之后父子进程共享文件84forkfork与与vforkvfork在fork还没实现copy on write之前。Unix设计者很关心fork之后立刻

35、执行exec所造成的地址空间浪费,所以引入了vfork系统调用。vfork有个限制,子进程必须立刻执行_exit或者exec函数。即使fork实现了copy on write,效率也没有vfork高,但是我们不推荐使用vfork,因为几乎每一个vfork的实现,都或多或少存在一定的问题。85进程的五种终止方式进程的五种终止方式正常退出从main函数返回调用exit调用_exit异常退出调用abort由信号终止86exitexit与与_exit_exit87进程运行调用终止处理程序清除I/O缓冲内核进程终止运行_exitexitatexitatexitatexit可以注册终止处理程序,ANSI

36、C规定最多可以注册32个终止处理程序。终止处理程序的调用与注册次序相反88int atexit(void(*function)(void);int atexit(void(*function)(void);execveexecve替换进程映像89int execve(const char*filename,char*const argv,char*const envp);int execve(const char*filename,char*const argv,char*const envp);进程(五)进程(五)第十三章第十三章90本章目标本章目标exec替换进程映像exec关联函数组(e

37、xecl、execlp、execle、execv、execvp)91exec替换进程映象替换进程映象在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进程替换掉。92exec关联函数组关联函数组包含头文件功能用exec函数可以把当前进程替换为一个新进程。exec名下是由多个关联函数组成的一个完整系列,头文件原型 int execl(const char*path,const char*arg,

38、.);int execlp(const char*file,const char*arg,.);int execle(const char*path,const char*arg,.,char*const envp);int execv(const char*path,char*const argv);int execvp(const char*file,char*const argv);参数path参数表示你要启动程序的名称包括路径名arg参数表示启动程序所带的参数返回值:成功返回0,失败返回-193execl,execlp,execle(都带“l”)的参数个数是可变的,参数以一个空指针结束

39、。execv和execvp的第二个参数是一个字符串数组,新程序在启动时会把在argv数组中给定的参数传递到main这些函数通常都是用execve实现的,这是一种约定俗成的做法,并不是非这样不可。exec关联函数组关联函数组名字最后一个字母是“p”的函数会搜索PATH环境变量去查找新程序的可执行文件。如果可执行文件不在PATH定义的路径上,就必须把包括子目录在内的绝对文件名做为一个参数传递给这些函数exec关联函数组关联函数组进程(六)进程(六)第十四章第十四章96本章目标本章目标SIGCHLDwaitwaitpid僵进程system97SIGCHLDSIGCHLD当子进程退出的时候,内核会向父

40、进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止)子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态。父进程查询子进程的退出状态可以用wait/waitpid函数98头文件和函数功能:当我们用fork启动一个进程时,子进程就有了自己的生命,并将独立地运行。有时,我们需要知道某个子进程是否已经结束了,我们可以通过wait安排父进程在子进程结束之后。函数原型pid_t wait(int*status)函数参数status:该参数可以获得你等待子进程的信息返回值:成功等待子进程函数返回

41、等待子进程的IDwaitwait系统调用会使父进程暂停执行,直到它的一个子进程结束为止。返回的是子进程的PID,它通常是结束的子进程状态信息允许父进程判定子进程的退出状态,即从子进程的main函数返回的值或子进程中exit语句的退出码。如果status不是一个空指针,状态信息将被写入它指向的位置wait宏定义描述WIFEXITED(status)如果子进程正常结束,返回一个非零值WEXITSTATUS(status)如果WIFEXITED非零,返回子进程退出码WIFSIGNALED(status)子进程因为捕获信号而终止,返回非零值WTERMSIG(status)如果WIFSIGNALED非零

42、,返回信号代码WIFSTOPPED(status)如果子进程被暂停,返回一个非零值WSTOPSIG(status)如果WIFSTOPPED非零,返回一个信号代码这些宏在sys/wait.h头文件里定义wait函数功能:用来等待某个特定进程的结束函数原型:pid_t waitpid(pid_t pid,int*status,int options)参数:status:如果不是空,会把状态信息写到它指向的位置options:允许改变waitpid的行为,最有用的一个选项是WNOHANG,它的作用是防止waitpid把调用者的执行挂起返回值:如果成功返回等待子进程的ID,失败返回-1waitpidw

43、aitpid函数说明函数说明对于waitpid的p i d参数的解释与其值有关:pid=-1 等待任一子进程。于是在这一功能方面waitpid与wait等效。pid 0 等待其进程I D与p i d相等的子进程。pid=0 等待其组I D等于调用进程的组I D的任一子进程。换句话说是与调用者进程同在一个组的进程。pid -1 等待其组I D等于p i d的绝对值的任一子进程。在一个子进程终止前,wait 使其调用者阻塞,而waitpid 有一选择项,可使调用者不阻塞。waitpid并不等待第一个终止的子进程它有若干个选择项,可以控制它所等待的特定进程。实际上wait函数是waitpid函数的一

44、个特例。wait和和waitpid的区别的区别当一个子进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行或者父进程调用了wait才告终止。进程表中代表子进程的数据项是不会立刻释放的,虽然不再活跃了,可子进程还停留在系统里,因为它的退出码还需要保存起来以备父进程中后续的wait调用使用。它将称为一个“僵进程”。僵进程僵进程调用wait或者waitpid函数查询子进程退出状态,此方法父进程会被挂起。如果不想让父进程挂起,可以在父进程中加入一条语句:signal(SIGCHLD,SIG_IGN);表示父进程忽略SIGCHLD信号,该信号是子进程退出的时候向父进程发送的。如何避免僵

45、进程如何避免僵进程systemsystem功能:system()函数调用“/bin/sh-c command”执行特定的命令,阻塞当前进程直到command命令执行完毕原型:int system(const char*command);返回值:如果无法启动shell运行命令,system将返回127;出现不能执行system调用的其他错误时返回-1。如果system能够顺利执行,返回那个命令的退出码。system函数执行时,会调用fork、execve、waitpid等函数。107my_systemmy_systemint my_system(const char*command)pid_t

46、pid;int status;if(command=NULL)return 1;if(pid=fork()0)status=-1;else if(pid=0)execl(/bin/sh,sh,-c,command,NULL);exit 127;108my_systemmy_systemelsewhile(waitpid(pid,&status,0)0)if(errno=EINTR)continue;status=-1;break;return status;109进程(七)进程(七)第十五章第十五章110本章目标本章目标什么是守护进程守护进程的创建步骤daemon111什么是守护进程什么是守护

47、进程守护进程是在后台运行不受控端控制的进程,通常情况下守护进程在系统启动时自动运行守护进程的名称通常以d结尾,比如sshd、xinetd、crond等112创建守护进程步骤创建守护进程步骤调用fork(),创建新进程,它会是将来的守护进程在父进程中调用exit,保证子进程不是进程组组长调用setsid创建新的会话期将当前目录改为根目录将标准输入、标准输出、标准错误重定向到/dev/null113daemon114int daemon(int nochdir,int noclose);int daemon(int nochdir,int noclose);功能:创建一个守护进程参数:nochdi

48、r:=0将当前目录更改至“/”noclose:=0将标准输入、标准输出、标准错误重定向至“/dev/null”信号(一)信号(一)第十六章第十六章115本章目标本章目标中断信号信号与中断signal116中断中断中断是系统对于异步事件的响应中断信号中断源现场信息中断处理程序中断向量表117中断分类中断分类硬件中断(外部中断)外部中断是指由外部设备通过硬件请求的方式产生的中断,也称为硬件中断软件中断(内部中断)内部中断是由CPU运行程序错误或执行内部程序调用引起的一种中断,也称为软件中断。118信号信号信号是UNIX系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。信号是因为某些

49、错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等信号是在软件层次上对中断的一种模拟,所以通常把它称为是软中断119信号与中断信号与中断信号与中断的相似点:(1)采用了相同的异步通信方式;(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;(3)都在处理完毕后返回到原来的断点;(4)对信号或中断都可进行屏蔽。信号与中断的区别:(1)中断有优先级,而信号没有优先级,所有的信号都是平等的;(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。120信号的名称是在头文件信号的名称是在头文

50、件 signal.hsignal.h里定义的里定义的信号名称描述SIGABRT进程停止运行SIGALRM警告钟SIGFPE算述运算例外SIGHUP系统挂断SIGILL非法指令SIGINT终端中断SIGKILL停止进程(此信号不能被忽略或捕获)SIGPIPE向没有读者的管道写入数据SIGSEGV无效内存段访问信号名称信号名称信号名称描述SIGQUIT终端退出SIGTERM终止SIGUSR1用户定义信号1SIGUSR2用户定义信号2SIGCHLD子进程已经停止或退出SIGCONT如果被停止则继续执行SIGSTOP停止执行SIGTSTP终端停止信号SIGTOUT后台进程请求进行写操作SIGTTIN后

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁