当UNIX系统出错时,通常会返回一个负值,整型变量errno
通常被设置为具有特定信息的值。文件<errno.h>
中定义了errno
以及可赋予的各种常量。
#include"apue.h"
#include <errno.h>
int main(int argc,char *argv[]){
fprintf(stderr,"EACCES:%s\n",strerror(EACCES)); //将错误码EACCES转换为对应字符串,输出到标准输出错误流stderr中
errno=ENOENT; //将全局变量errno设置为ENOENT错误码,表示没有该文件或目录的错误
perror(argv[0]);//根据 errno的值打印出相应错误信息,并在后面附上argv[0]的内容
exit(0);
}
信号用于通知进程发生了某种情况,是进程间的通信机制。例如,某一进程在执行出发操作,除数为0,则将名为SIGFPE
(浮点异常)的信号发送给进程。进程有以下三种处理信号的方式:
1.忽略信号
2.按系统默认的方式处理
3.提供一个函数
以下是一些常见的UNIX信号:
SIGINT (2)
:终止进程的中断信号。通常由终端键入的中断字符(例如Ctrl+C)触发。SIGTERM (15)
:终止进程的请求信号。通常用于优雅地终止进程。SIGHUP (1)
:终端挂起信号。当终端连接断开时发送给进程,通常用于通知进程重新读取配置文件。SIGKILL (9)
:强制终止进程的信号。该信号无法被捕获或忽略,并且立即终止目标进程。SIGSTOP (19)
:暂停进程的信号。该信号无法被捕获或忽略,并且使目标进程停止执行。SIGCONT (18)
:恢复进程的执行信号。用于恢复由SIGSTOP
或SIGTSTP
暂停的进程。还有其他许多信号可以用于不同的目的,如处理错误、子进程状态更改、定时器触发等。
进程可以使用系统调用(如kill
)发送信号给其他进程,也可以使用signal
函数来设置自己接收信号并指定对应的处理逻辑。
#include "apue.h"
#include<sys/wait.h>
static void sig_int(int);
int main(void){
char buf[MAXLINE];
pid_t pid;
int status;
if(signal(SIGINT,sig_int)==SIG_ERR){ //使用signal函数设置SIGINT信号的处理函数为sig_int。如果设置失败,则打印错误信息并退出程序。
err_sys("signal error");
}
printf("%% ");
while(fgets(buf,MAXLINE,stdin)!=NULL){
if(buf[strlen(buf)-1]=='\n'){
buf[strlen(buf)-1]=0;
}
if((pid=fork())<0){
err_sys("fork error");
}else if(pid==0){
execlp(buf,buf,(char*)0);
err_ret("couldn't execute:%s",buf);
exit(127);
}
if((pid=waitpid(pid,&status,0))<0){
err_sys("waitpid error");
}
printf("%% ");
}
exit(0);
}
void sig_int(int signo){
printf("interrupt\n%% ");
}
当按下Ctrl+C时,程序将会打印interrupt。
至此,第一章UNIX基础知识已经结束,下一章将对UNIX标准及实现进行讲述。
694340007156)]
当按下Ctrl+C时,程序将会打印interrupt。
至此,第一章UNIX基础知识已经结束,下一章将对UNIX标准及实现进行讲述。