参数 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,如果有错误则返回-1。 EINVAL 参数 signum 不合法, 或是企图拦截 SIGKILL/SIGSTOPSIGKILL 信号 EFAULT 参数 act,oldact 指针地址无法存取。 EINTR 此调用被中断 范例 #include #include void show_handler(struct sigaction * act) { switch (act->sa_flags) { case SIG_DFL:printf(“Default action\n”);break; case 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); for(i=5;i<15;i++) { printf(“sa_handler of signal %2d =”.i); sigaction(i,NULL,&oldact); } } 执行 sa_handler of signal 5 = Default action sa_handler of signal 6= Default action sa_handler of signal 7 = Default action sa_handler of signal 8 = Default action sa_handler of signal 9 = Default action sa_handler of signal 10 = 0x8048400 sa_handler of signal 11 = Default action sa_handler of signal 12 = Default action sa_handler of signal 13 = Default action sa_handler of signal 14 = Default action SIG_IGN:printf(“Ignore the signal\n”);break; sigaddset(增加一个信号至信号集) 相关函数 sigemptyset , sigfillset , sigdelset , sigismember 表头文件 定义函数 #include int sigaddset(sigset_t *set,int signum); 函数说明 sigaddset()用来将参数 signum 代表的信号加 入至参数 set 信号集里。 返回值 错误代码 执行成功则返回0,如果有错误则返回-1。 EFAULT 参数 set 指针地址无法存取 EINVAL 参数 signum 非合法的信号编号 sigdelset(从信号集里删除一个信号) 相关函数 sigemptyset , sigfillset , sigaddset , sigismember 表头文件 定义函数 函数说明 #include int sigdelset(sigset_t * set,int signum); sigdelset()用来将参数 signum 代表的信号从 参数 set 信号集里删除。 返回值 错误代码 执行成功则返回0,如果有错误则返回-1。 EFAULT 参数 set 指针地址无法存取 EINVAL 参数 signum 非合法的信号编号 sigemptyset(初始化信号集) 相关函数 sigaddset , sigfillset , sigdelset , sigismember 表头文件 定义函数 函数说明 #include int sigemptyset(sigset_t *set); sigemptyset()用来将参数 set 信号集初始化并 清空。 返回值 执行成功则返回0,如果有错误则返回-1。 错误代码 EFAULT 参数 set 指针地址无法存取 sigfillset(将所有信号加入至信号集) 相关函数 表头文件 定义函数 函数说明 sigempty, sigaddset, sigdelset, sigismember #include int sigfillset(sigset_t * set); sigfillset()用来将参数 set 信号集初始化, 然 后把所有的信号加入到此信号集里。 返回值 附加说明 执行成功则返回0,如果有错误则返回-1。 EFAULT 参数 set 指针地址无法存取 sigismember(测试某个信号是否已加入至信号 集里) 相关函数 sigemptyset , sigfillset , sigaddset , sigdelset 表头文件 定义函数 #include int sigismember(const sigset_t *set,int signum); 函数说明 sigismember()用来测试参数 signum 代表的信 号是否已加入至参数 set 信号集里。 如果信号集 里已有该信号则返回1,否则返回0。 返回值 信号集已有该信号则返回1, 没有则返回0。 如果 有错误则返回-1。 错误代码 EFAULT 参数 set 指针地址无法存取 EINVAL 参数 signum 非合法的信号编号 signal(设置信号处理方式) 相关函数 表头文件 定义函数 sigaction,kill,raise #include void (*signal(int signum,void(* handler)(int)))(int); 函数说明 signal()会依参数 signum 指定的信号编号来 设置该信号的处理函数。 当指定的信号到达时就 会跳转到参数 handler 指定的函数执行。 如果参 数 handler 不是函数指针, 则必须是下列两个常 数之一: SIG_IGN 忽略参数 signum 指定的信号。 SIG_DFL 将参数 signum 指定的信号重设为核 心预设的信号处理方式。 关于信号的编号和说明,请参考附录 D 返回值 返回先前的信号处理函数指针, 如果有错误则返 回 SIG_ERR(-1)。 附加说明 在信号发生跳转到自定的 handler 处理函数执 行后, 系统会自动将此处理函数换回原来系统预 设的处理方式,如果要改变此操作请改用 sigaction()。 范例 参考 alarm()或 raise()。 sigpending(查询被搁置的信号) 相关函数 表头文件 定义函数 signal,sigaction,sigprocmask,sigsuspend #include int sigpending(sigset_t *set); 函数说明 sigpending() 会 将 被 搁 置 的 信 号 集 合 由 参 数 set 指针返回。 返回值执 错误代码 行成功则返回0,如果有错误则返回-1。 EFAULT 参数 set 指针地址无法存取 EINTR 此调用被中断。 sigprocmask(查询或设置信号遮罩) 相关函数 表头文件 定义函数 signal,sigaction,sigpending,sigsuspend #include 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,如果有错误则返回-1。 EFAULT 参数 set,oldset 指针地址无法存取。 EINTR 此调用被中断 sleep(让进程暂停执行一段时间) 相关函数 表头文件 signal,alarm #include 定义函数 函数说明 unsigned int sleep(unsigned int seconds); sleep()会令目前的进程暂停,直到达到参数 seconds 所指定的时间,或是被信号所中断。 返回值 若进程暂停到参数 seconds 所指定的时间则返 回0,若有信号中断则返回剩余秒数。 ferror(检查文件流是否有错误发生) 相关函数 表头文件 定义函数 函数说明 clearerr,perror #include int ferror(FILE *stream); ferror()用来检查参数 stream 所指定的文件流 是否发生了错误情况,如有错误发生则返回非0 值。 返回值 如果文件流有错误发生则返回非0值。 perror(打印出错误原因信息字符串) 相关函数 表头文件 定义函数 函数说明 strerror #include void perror(const char *s); perror()用来将上一个函数发生错误的原因输 出到标准错误(stderr)。 参数 s 所指的字符串会 先打印出, 后面再加上错误原因字符串。 此错误 原因依照全局变量 errno 的值来决定要输出的 字符串。 返回值 范例 #include main() { FILE *fp; fp = fopen(“/tmp/noexist”,”r+”); if(fp = =NULL) perror(“fopen”); } 执行 $ ./perror fopen : No such file or diretory strerror(返回错误原因的描述字符串) 相关函数 表头文件 定义函数 函数说明 perror #include char * strerror(int errnum); strerror()用来依参数 errnum 的错误代码来查 询其错误原因的描述字符串, 然后将该字符串指 针返回。 返回值 范例 返回描述错误原因的字符串指针。 /* 显示错误代码0 至9 的错误原因描述*/ #include main() { int i; for(i=0;i<10;i++) printf(“%d : %s\n”,i,strerror(i)); } 执行 0 : Success 1 : Operation not permitted 2 : No such file or directory 3 : No such process 4 : Interrupted system call 5 : Input/output error 6 : Device not configured 7 : Argument list too long 8 : Exec format error 9 : Bad file descriptor mkfifo(建立具名管道) 相关函数 表头文件 pipe,popen,open,umask #include #include 定义函数 int mkfifo(const char * pathname,mode_t mode); 函数说明 mkfifo()会依参数 pathname 建立特殊的 FIFO 文件,该文件必须不存在,而参数 mode 为该文 件的权限 (mode%~umask) 因此 umask 值也会影 , 响到 FIFO 文件的权限。Mkfifo()建立的 FIFO 文件其他进程都可以用读写一般文件的方式存 取 。 当 使 用 open() 来 打 开 FIFO 文 件 时 , O_NONBLOCK 旗标会有影响 1、 当使用 O_NONBLOCK 旗标时, 打开 FIFO 文件 来读取的操作会立刻返回, 但是若还没有其他进 程打开 FIFO 文件来读取, 则写入的操作会返回 ENXIO 错误代码。 2、 没有使用 O_NONBLOCK 旗标时, 打开 FIFO 来 读取的操作会等到其他进程打开 FIFO 文件来写 入才正常返回。同样地,打开 FIFO 文件来写入 的操作会等到其他进程打开 FIFO 文件来读取 后才正常返回。 返回值 若成功则返回0,否则返回-1,错误原因存于 errno 中。 错误代码 EACCESS 参数 pathname 所指定的目录路径无可 执行的权限 EEXIST 参数 pathname 所指定的文件已存在。 ENAMETOOLONG 参数 pathname 的路径名称太长。 ENOENT 参数 pathname 包含的目录不存在 ENOSPC 文件系统的剩余空间不足 ENOTDIR 参数 pathname 路径中的目录存在但却 非真正的目录。 EROFS 参数 pathname 指定的文件存在于只读文 件系统内。 范例 #include #include #include main() { char buffer[80]; int fd; unlink(FIFO); mkfifo(FIFO,0666); if(fork()>0){ 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,80); printf(“%s”,buffer); close(fd); } } 执行 hello! pclose(关闭管道 I/O) 相关函数 表头文件 定义函数 函数说明 popen #include int pclose(FILE * stream); pclose()用来关闭由 popen 所建立的管道及文 件指针。