信号处理篇alarm ferror kill mkfifo pause pclose perror pipe popen sigaction sigaddset sigdelset sigemptyset signal sleep strerror
alarm(设置信号传送闹钟) 相关函数 signal,sleep 表头文件 #include<unistd.h> 定义函数 unsigned int alarm(unsigned int seconds); 函数说明 alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds 为0,则之前设置的闹钟会被取消,并将剩下的时间返回。 返回值 返回之前闹钟的剩余秒数,如果之前未设闹钟则返回0。 范例 #include<unistd.h> #include<signal.h> void handler() { printf(“hello\n”); } main() { int i; signal(SIGALRM,handler); alarm(); ;i<;i++){ printf(“sleep %d ...\n”,i); sleep(); } } 执行 sleep ... sleep ... sleep ... sleep ... sleep ... hello sleep ... kill(传送信号给指定的进程) 相关函数 raise,signal 表头文件 #include<sys/types.h> #include<signal.h> 定义函数 int kill(pid_t pid,int sig); 函数说明 kill()可以用来送参数sig指定的信号给参数pid指定的进程。参数pid有几种情况: pid> 将信号传给进程识别码为pid 的进程。 pid= 将信号传给和目前进程相同进程组的所有进程 pid=- 将信号广播传送给系统内所有的进程 pid< 将信号传给进程组识别码为pid绝对值的所有进程 参数sig代表的信号编号可参考附录D 返回值 执行成功则返回0,如果有错误则返回-。 错误代码 EINVAL 参数sig 不合法 ESRCH 参数pid 所指定的进程或进程组不存在 EPERM 权限不够无法传送信号给指定进程 范例 #include<unistd.h> #include<signal.h> #include<sys/types.h> #include<sys/wait.h> main() { pid_t pid; int status; if(!(pid= fork())){ printf(“Hi I am child process!\n”); sleep(); return; } else{ printf(“send signal to child process (%d) \n”,pid); sleep(); kill(pid ,SIGABRT); wait(&status); if(WIFSIGNALED(status)) printf(“chile process receive signal %d\n”,WTERMSIG(status)); } } 执行 sen signal to child process() Hi I am child process! child process receive signal pause(让进程暂停直到信号出现) 相关函数 kill,signal,sleep 表头文件 #include<unistd.h> 定义函数 int pause(void); 函数说明 pause()会令目前的进程暂停(进入睡眠状态),直到被信号(signal)所中断。 返回值 只返回-。 错误代码 EINTR 有信号到达中断了此函数。 sigaction(查询或设置信号处理方式) 相关函数 signal,sigprocmask,sigpending,sigsuspend 表头文件 #include<signal.h> 定义函数 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact); 函数说明 sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号。 如参数结构sigaction定义如下 struct sigaction { void (*sa_handler) (int); sigset_t sa_mask; int sa_flags; void (*sa_restorer) (void); } sa_handler此参数和signal()的参数handler相同,代表新的信号处理函数,其他意义请参考signal()。 sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号搁置。 sa_restorer 此参数没有使用。 sa_flags 用来设置信号处理的其他相关操作,下列的数值可用。 OR 运算(|)组合 A_NOCLDSTOP : 如果参数signum为SIGCHLD,则当子进程暂停时并不会通知父进程 SA_ONESHOT/SA_RESETHAND:当调用新的信号处理函数前,将此信号处理方式改为系统预设的方式。 SA_RESTART:被信号中断的系统调用会自行重启 SA_NOMASK/SA_NODEFER:在处理此信号未结束前不理会此信号的再次到来。 如果参数oldact不是NULL指针,则原来的信号处理方式会由此结构sigaction 返回。 返回值 执行成功则返回0,如果有错误则返回-。 错误代码 EINVAL 参数signum 不合法, 或是企图拦截SIGKILL/SIGSTOPSIGKILL信号 EFAULT 参数act,oldact指针地址无法存取。 EINTR 此调用被中断 范例 #include<unistd.h> #include<signal.h> void show_handler(struct sigaction * act) { switch (act->sa_flags) { case SIG_DFL:printf(“Default action\n”);break; case SIG_IGN:printf(“Ignore the signal\n”);break; default: printf(“0x%x\n”,act->sa_handler); } } main() { int i; struct sigaction act,oldact; act.sa_handler = show_handler; act.sa_flags = SA_ONESHOT|SA_NOMASK; sigaction(SIGUSR1,&act,&oldact); ;i<;i++) { printf(“sa_handler of signal %2d =”.i); sigaction(i,NULL,&oldact); } } 执行 sa_handler of signal = Default action sa_handler of signal = Default action sa_handler of signal = Default action sa_handler of signal = Default action sa_handler of signal = Default action sa_handler of signal = 0x8048400 sa_handler of signal = Default action sa_handler of signal = Default action sa_handler of signal = Default action sa_handler of signal = Default action sigaddset(增加一个信号至信号集) 相关函数 sigemptyset,sigfillset,sigdelset,sigismember 表头文件 #include<signal.h> 定义函数 int sigaddset(sigset_t *set,int signum); 函数说明 sigaddset()用来将参数signum 代表的信号加入至参数set 信号集里。 返回值 执行成功则返回0,如果有错误则返回-。 错误代码 EFAULT 参数set指针地址无法存取 EINVAL 参数signum非合法的信号编号 sigdelset(从信号集里删除一个信号) 相关函数 sigemptyset,sigfillset,sigaddset,sigismember 表头文件 #include<signal.h> 定义函数 int sigdelset(sigset_t * set,int signum); 函数说明 sigdelset()用来将参数signum代表的信号从参数set信号集里删除。 返回值 执行成功则返回0,如果有错误则返回-。 错误代码 EFAULT 参数set指针地址无法存取 EINVAL 参数signum非合法的信号编号 sigemptyset(初始化信号集) 相关函数 sigaddset,sigfillset,sigdelset,sigismember 表头文件 #include<signal.h> 定义函数 int sigemptyset(sigset_t *set); 函数说明 sigemptyset()用来将参数set信号集初始化并清空。 返回值 执行成功则返回0,如果有错误则返回-。 错误代码 EFAULT 参数set指针地址无法存取 sigfillset(将所有信号加入至信号集) 相关函数 sigempty,sigaddset,sigdelset,sigismember 表头文件 #include<signal.h> 定义函数 int sigfillset(sigset_t * set); 函数说明 sigfillset()用来将参数set信号集初始化,然后把所有的信号加入到此信号集里。 返回值 执行成功则返回0,如果有错误则返回-。 附加说明 EFAULT 参数set指针地址无法存取 sigismember(测试某个信号是否已加入至信号集里) 相关函数 sigemptyset,sigfillset,sigaddset,sigdelset 表头文件 #include<signal.h> 定义函数 int sigismember(const sigset_t *set,int signum); 函数说明 sigismember()用来测试参数signum 代表的信号是否已加入至参数set信号集里。如果信号集里已有该信号则返回1,否则返回0。 返回值 信号集已有该信号则返回1,没有则返回0。如果有错误则返回-。 错误代码 EFAULT 参数set指针地址无法存取 EINVAL 参数signum 非合法的信号编号 signal(设置信号处理方式) 相关函数 sigaction,kill,raise 表头文件 #include<signal.h> 定义函数 void (*signal(int signum,void(* handler)(int)))(int); 函数说明 signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。如果参数handler不是函数指针,则必须是下列两个常数之一: SIG_IGN 忽略参数signum指定的信号。 SIG_DFL 将参数signum 指定的信号重设为核心预设的信号处理方式。 关于信号的编号和说明,请参考附录D 返回值 返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-)。 附加说明 在信号发生跳转到自定的handler处理函数执行后,系统会自动将此处理函数换回原来系统预设的处理方式,如果要改变此操作请改用sigaction()。 范例 参考alarm()或raise()。 sigpending(查询被搁置的信号) 相关函数 signal,sigaction,sigprocmask,sigsuspend 表头文件 #include<signal.h> 定义函数 int sigpending(sigset_t *set); 函数说明 sigpending()会将被搁置的信号集合由参数set指针返回。 返回值执 行成功则返回0,如果有错误则返回-。 错误代码 EFAULT 参数set指针地址无法存取 EINTR 此调用被中断。 sigprocmask(查询或设置信号遮罩) 相关函数 signal,sigaction,sigpending,sigsuspend 表头文件 #include<signal.h> 定义函数 int sigprocmask(int how,const sigset_t *set,sigset_t * oldset); 函数说明 sigprocmask()可以用来改变目前的信号遮罩,其操作依参数how来决定 SIG_BLOCK 新的信号遮罩由目前的信号遮罩和参数set 指定的信号遮罩作联集 SIG_UNBLOCK 将目前的信号遮罩删除掉参数set指定的信号遮罩 SIG_SETMASK 将目前的信号遮罩设成参数set指定的信号遮罩。 如果参数oldset不是NULL指针,那么目前的信号遮罩会由此指针返回。 返回值 执行成功则返回0,如果有错误则返回-。 错误代码 EFAULT 参数set,oldset指针地址无法存取。 EINTR 此调用被中断 sleep(让进程暂停执行一段时间) 相关函数 signal,alarm 表头文件 #include<unistd.h> 定义函数 unsigned int sleep(unsigned int seconds); 函数说明 sleep()会令目前的进程暂停,直到达到参数seconds 所指定的时间,或是被信号所中断。 返回值 若进程暂停到参数seconds 所指定的时间则返回0,若有信号中断则返回剩余秒数。 ferror(检查文件流是否有错误发生) 相关函数 clearerr,perror 表头文件 #include<stdio.h> 定义函数 int ferror(FILE *stream); 函数说明 ferror()用来检查参数stream所指定的文件流是否发生了错误情况,如有错误发生则返回非0值。 返回值 如果文件流有错误发生则返回非0值。 perror(打印出错误原因信息字符串) 相关函数 strerror 表头文件 #include<stdio.h> 定义函数 void perror(const char *s); 函数说明 perror()用来将上一个函数发生错误的原因输出到标准错误(stderr)。参数s所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。 返回值 范例 #include<stdio.h> main() { FILE *fp; fp = fopen(“/tmp/noexist”,”r+”); if(fp = =NULL) perror(“fopen”); } 执行 $ ./perror fopen : No such file or diretory strerror(返回错误原因的描述字符串) 相关函数 perror 表头文件 #include<string.h> 定义函数 char * strerror(int errnum); 函数说明 strerror()用来依参数errnum的错误代码来查询其错误原因的描述字符串,然后将该字符串指针返回。 返回值 返回描述错误原因的字符串指针。 范例 /* 显示错误代码0 至9 的错误原因描述*/ #include<string.h> main() { int i; ;i<;i++) printf(“%d : %s\n”,i,strerror(i)); } 执行 : Success : Operation not permitted : No such file or directory : No such process : Interrupted system call : Input/output error : Device not configured : Argument list too long : Exec format error : Bad file descriptor mkfifo(建立具名管道) 相关函数 pipe,popen,open,umask 表头文件 #include<sys/types.h> #include<sys/stat.h> 定义函数 int mkfifo(const char * pathname,mode_t mode); 函数说明 mkfifo()会依参数pathname建立特殊的FIFO文件,该文件必须不存在,而参数mode为该文件的权限(mode%~umask),因此 umask值也会影响到FIFO文件的权限。Mkfifo()建立的FIFO文件其他进程都可以用读写一般文件的方式存取。当使用open()来打开 FIFO文件时,O_NONBLOCK旗标会有影响 、当使用O_NONBLOCK 旗标时,打开FIFO 文件来读取的操作会立刻返回,但是若还没有其他进程打开FIFO 文件来读取,则写入的操作会返回ENXIO 错误代码。 、没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操作会等到其他进程打开FIFO文件来写入才正常返回。同样地,打开FIFO文件来写入的操作会等到其他进程打开FIFO 文件来读取后才正常返回。 返回值 若成功则返回0,否则返回-,错误原因存于errno中。 错误代码 EACCESS 参数pathname所指定的目录路径无可执行的权限 EEXIST 参数pathname所指定的文件已存在。 ENAMETOOLONG 参数pathname的路径名称太长。 ENOENT 参数pathname包含的目录不存在 ENOSPC 文件系统的剩余空间不足 ENOTDIR 参数pathname路径中的目录存在但却非真正的目录。 EROFS 参数pathname指定的文件存在于只读文件系统内。 范例 #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> main() { ]; int fd; unlink(FIFO); mkfifo(FIFO,); ){ char s[ ] = “hello!\n”; fd = open (FIFO,O_WRONLY); write(fd,s,sizeof(s)); close(fd); } else{ fd= open(FIFO,O_RDONLY); read(fd,buffer,); printf(“%s”,buffer); close(fd); } } 执行 hello! pclose(关闭管道I/O) 相关函数 popen 表头文件 #include<stdio.h> 定义函数 int pclose(FILE * stream); 函数说明 pclose()用来关闭由popen所建立的管道及文件指针。参数stream为先前由popen()所返回的文件指针。 返回值 返回子进程的结束状态。如果有错误则返回-,错误原因存于errno中。 错误代码 ECHILD pclose()无法取得子进程的结束状态。 范例 参考popen()。 pipe(建立管道) 相关函数 mkfifo,popen,read,write,fork 表头文件 #include<unistd.h> 定义函数 ]); 函数说明 pipe()会建立管道,并将文件描述词由参数filedes数组返回。filedes[]为管道里的读取端,filedes[]则为管道的写入端。 返回值 若成功则返回零,否则返回-,错误原因存于errno中。 错误代码 EMFILE 进程已用完文件描述词最大量。 ENFILE 系统已无文件描述词可用。 EFAULT 参数filedes数组地址不合法。 范例 /* 父进程借管道将字符串“hello!\n”传给子进程并显示*/ #include <unistd.h> main() { ]; ]; pipe(filedes); ){ /* 父进程*/ char s[ ] = “hello!\n”; write(filedes[],s,sizeof(s)); } else{ /*子进程*/ read(filedes[],buffer,); printf(“%s”,buffer); } } 执行 hello! popen(建立管道I/O) 相关函数 pipe,mkfifo,pclose,fork,system,fopen 表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * type); 函数说明 popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准 输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文 件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。 返回值 若成功则返回文件指针,否则返回NULL,错误原因存于errno中。 错误代码 EINVAL参数type不合法。 注意事项 在编写具SUID/SGID权限的程序时请尽量避免使用popen(),popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。 范例 #include<stdio.h> main() { FILE * fp; ]; fp=popen(“cat /etc/passwd”,”r”); fgets(buffer,sizeof(buffer),fp); printf(“%s”,buffer); pclose(fp); } 执行 root :x: : root: /root: /bin/bash
信号处理篇alarm ferror kill mkfifo pause pclose perror pipe popen sigaction sigaddset sigdelset sigemptyset signal sleep strerror的更多相关文章
- Linux进程间通信(三):匿名管道 popen()、pclose()、pipe()、close()、dup()、dup2()
在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据. 一.什 ...
- linux常用C函数目录
字符测试篇 isalnum isalpha isascii iscntrl isdigit isgraphis islower isprint isspace ispunct isupper isxd ...
- Unix网络编程第三版源码编译
配置: $ cd Unix-Network-Programming/ $ chmod 755 configure $ ./configure 主要的工作是检查系统是否有源码编译所依赖的各种资源(系统版 ...
- linux中alarm函数和pause函数详解实例
alarm(time);执行之后告诉内核,让内核在time秒时间之后向该进程发送一个定时信号,然后该进程捕获该信号并处理:pause()函数使该进程暂停让出CPU,但是该函数的暂停和前面的那个slee ...
- Python3 与 C# 并发编程之~进程先导篇
在线预览:http://github.lesschina.com/python/base/concurrency/1.并发编程-进程先导篇.html Python3 与 C# 并发编程之- 进程篇 ...
- Android 信号处理面面观 之 信号定义、行为和来源
总结: Android中: Sending signal. PID: XXX SIG: 3 ====>打印trace 原文:http://blog.csdn.net/rambo2188/ar ...
- linux进程篇 (三) 进程间的通信2 信号通信
2. 信号通信 用户空间 进程A <----无法通信----> 进程B -----------------|--------------------------------------|- ...
- 【linux高级程序设计】(第十章)Linux异步信号处理机制 3
信号屏蔽 信号忽略:系统仍然传递该信号,只是相应的进程不做任何处理 信号屏蔽:进程不捕获信号,信号处于未决状态,当不再屏蔽信号时可以捕获之前被屏蔽的信号. 信号集数据结构定义: typedef __s ...
- Linux程序设计学习笔记——异步信号处理机制
转载请注明出处: http://blog.csdn.net/suool/article/details/38453333 Linux常见信号与处理 基本概念 Linux的信号是一种进程间异步的通信机制 ...
随机推荐
- phpstorm 输入法中文不同步 phpstorm 输入法不跟随光标解决办法
win7系统新安装的phpstorm2017.2版本,试了很多输入法,要么是不显示候选次,要么是输入法候选词总是在屏幕右下角,没有跟随光标移动.百度很久,重要找到解决方案. 就是替换phpstorm安 ...
- poj1251 Jungle Roads(Prime || Kruskal)
题目链接 http://poj.org/problem?id=1251 题意 有n个村庄,村庄之间有道路连接,求一条最短的路径能够连接起所有村庄,输出这条最短路径的长度. 思路 最小生成树问题,使用普 ...
- 模拟界面请求到web服务器
客户端 package com.lsw.client; import java.io.*; import java.net.*; import java.util.*; public class HT ...
- CSUOJ 1726 你经历过绝望吗?两次!BFS+优先队列
Description 4月16日,日本熊本地区强震后,受灾严重的阿苏市一养猪场倒塌,幸运的是,猪圈里很多头猪依然坚强存活.当地15名消防员耗时一天解救围困的"猪坚强".不过与在废 ...
- UVALive - 6912 Prime Switch (状压DP)
题目链接:传送门 [题意]有n个灯,m个开关,灯的编号从1~n,每个开关上有一个质数,这个开关同时控制编号为这个质数的倍数的灯,问最多有多少灯打开. [分析]发现小于根号1000的质数有10个左右,然 ...
- HDU 6103 Kirinriki (思维 双指针)
Kirinriki Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- eclipse 背景颜色
步骤阅读 3 本例使用的背景色是喜大普奔的豆沙绿,比较柔和 设置为:色调:85.饱和度:120.亮度:208 即可,据说长时间使用可以缓解眼疲劳哦. (吐槽:开什么玩笑,远离编程才能缓解眼疲劳好吗)
- phantomjs-prebuilt@2.1.16 install: `node install.js`
今天运行vue项目安装项目依赖(npm install)的时候,报这个错误: 解决办法: npm -g install phantomjs-prebuilt@2.1.16 --ignore-scrip ...
- 利用python制作电子签名
有时候我们需要在文档里粘上电子签名,通常使用photoshop制作,但是通常photoshop软件还需要下载.安装,对于不经常使用的人来说,单独装这个软件没啥必要. 因此我们可以利用python对签名 ...
- es6新增功能
声明命令 1. let命令 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效.下面代码在代码块之中,分别用let和var声明了两个变量.然 ...