第9章 Linux编程—信号函数

上传人:工**** 文档编号:571449846 上传时间:2024-08-10 格式:PDF 页数:26 大小:244.13KB
返回 下载 相关 举报
第9章 Linux编程—信号函数_第1页
第1页 / 共26页
第9章 Linux编程—信号函数_第2页
第2页 / 共26页
第9章 Linux编程—信号函数_第3页
第3页 / 共26页
第9章 Linux编程—信号函数_第4页
第4页 / 共26页
第9章 Linux编程—信号函数_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《第9章 Linux编程—信号函数》由会员分享,可在线阅读,更多相关《第9章 Linux编程—信号函数(26页珍藏版)》请在金锄头文库上搜索。

1、LinuxLinux操作系统操作系统操作系统操作系统 大工软件学院嵌入式系大工软件学院嵌入式系邱铁邱铁办公楼办公楼409Tel:87571521E_mail:第9章Linux编程信号函数sleep(让进程暂停执行一段时间)(让进程暂停执行一段时间)alarm(设置信号传送闹钟)(设置信号传送闹钟)示例解析示例解析 #include #include void handler() printf(hellon); main() int i; signal(SIGALRM,handler); alarm(5); for(i=1;i7;i+) printf(sleep %d .n,i); sleep(

2、1); kill(传送信号给指定的进程)(传送信号给指定的进程)续 错误代码错误代码 EINVAL 参数sig不合法 ESRCH 参数pid所指定的进程或进程组不存在 EPERM 权限不够无法传送信号给指定进程pid_t wait(int *status) 发出wait调用的进程进入睡眠直到它的一个子进程退出时或收到一个不能被忽略的信号时被唤醒。如果调用发出时,已经有退出的子进程(这时子进程的状态是僵死状态),该调用立即返回。其中调用返回时参数status中包含子进程退出时的状态信息。 WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真WTERMSIG(status)

3、取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。示例解析示例解析 #include #include #include #include main() pid_t pid; int status; if(!(pid= fork() printf(Hi ,I am child process!n); sleep(10); return;续 else printf(send signal to child process (%d) n,pid); sleep(1); kill(pid ,SIGABRT); wait(&status); if(WIFSIGNA

4、LED(status) printf(chile process receive signal %dn,WTERMSIG(status); pause(让进程暂停直到信号出现)(让进程暂停直到信号出现)perror(打印出错误原因信息字符串)(打印出错误原因信息字符串)示例解析示例解析 #include main() FILE *fp; fp = fopen(/tmp/noexist,r+); if(fp =NULL) perror(fopen); strerror返回错误原因的描述字符串返回错误原因的描述字符串示例解析示例解析 /* 显示错误代码0 至9 的错误原因描述 */ #includ

5、e main() int i; for(i=0;i10;i+) printf(%d : %sn,i,strerror(i); mkfifo(建立命名管道)(建立命名管道) 表头文件表头文件 #include #include 定义函数定义函数 int mkfifo(const char * pathname,mode_t mode);续 函数说明函数说明mkfifo()会依参数pathname 建立特殊的FIFO 文件,该文件必须不存在,而参数mode为该文件的权限(mode%umask),因此umask值也会影响到FIFO 文件的权限。mkfifo()建立的FIFO 文件其他进程都可以用读写

6、一般文件的方式存取。当使用open()来打开FIFO 文件时,O_NONBLOCK 旗标会有影响:1、当使用O_NONBLOCK 旗标时,打开FIFO 文件来读取的操作会立刻返回,但是若还没有其他进程打开FIFO 文件来读取,则写入的操作会返回ENXIO 错误代码。2、没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操作会等到其他进程打开FIFO文件来写入才正常返回。同样地,打开FIFO文件来写入的操作会等到其他进程打开FIFO 文件来读取后才正常返回。续 返回值返回值 若成功则返回0,否则返回-1,错误原因存于errno中。 错误代码错误代码EACCESS 参数pathname

7、所指定的目录路径无可执行的权限EEXIST 参数pathname 所指定的文件已存在。ENAMETOOLONG 参数pathname 的路径名称太长。ENOENT 参数pathname包含的目录不存在ENOSPC 文件系统的剩余空间不足ENOTDIR 参数pathname路径中的目录存在但却非真正的目录。EROFS 参数pathname 指定的文件存在于只读文件系统内。示例解析示例解析 #include #include #include #define FIFO /tmp/fifo main() char buffer80; int fd; unlink(FIFO); mkfifo(FIFO

8、,0666);续if(fork()0)char s = hello!n;fd = open (FIFO,O_WRONLY);write(fd,s,sizeof(s);close(fd);elsefd= open(FIFO,O_RDONLY);read(fd,buffer,80);printf(%s,buffer);close(fd);pipe(建立管道)(建立管道) 表头文件表头文件 #include 定义函数定义函数 int pipe(int filedes2); 函数说明函数说明 pipe()会建立管道,并将文件描述词由参数filedes 数组返回。filedes0为管道里的读取端,fil

9、edes1则为管道的写入端。 返回值返回值 若成功则返回零,否则返回-1,错误原因存于errno中。 错误代码错误代码 EMFILE 进程已用完文件描述词最大量 ENFILE 系统已无文件描述词可用。 EFAULT 参数filedes 数组地址不合法。示例解析示例解析/* 父进程借管道将字符串“hello!n”传给子进程并显示 */#include main()int filedes2;char buffer80;pipe(filedes);if(fork()0)/* 父进程*/char s = hello!n;write(filedes1,s,sizeof(s);else/*子进程*/rea

10、d(filedes0,buffer,80);printf(%s,buffer);popen(建立管道(建立管道I/O) 表头文件表头文件 #include 定义函数定义函数 FILE * popen( const char * command,const char * type); 函数说明函数说明 popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh-c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取

11、子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。续 返回值返回值 若成功则返回文件指针,否则返回NULL,错误原因存于errno中。 错误代码错误代码 EINVAL 参数type不合法。 注意事项注意事项 在编写具SUID/SGID权限的程序时请尽量避免使用popen(),popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。示例解析示例解析 #include main() FILE * fp; char buffer80; fp=popen(cat /etc/passwd,r); fgets(buffer,sizeof(buffer),fp); printf(%s,buffer); pclose(fp);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号