一、UNIX基础知识(4)

UNIX基础知识(4)

五、出错处理

当UNIX系统出错时,通常会返回一个负值,整型变量errno通常被设置为具有特定信息的值。文件中定义了errno以及可赋予的各种常量。

实例

#include"apue.h"
#include 

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);
}

image-20230910155757286

六、信号

信号用于通知进程发生了某种情况,是进程间的通信机制。例如,某一进程在执行出发操作,除数为0,则将名为SIGFPE(浮点异常)的信号发送给进程。进程有以下三种处理信号的方式:

1.忽略信号

2.按系统默认的方式处理

3.提供一个函数

以下是一些常见的UNIX信号:

  1. SIGINT (2):终止进程的中断信号。通常由终端键入的中断字符(例如Ctrl+C)触发。
  2. SIGTERM (15):终止进程的请求信号。通常用于优雅地终止进程。
  3. SIGHUP (1):终端挂起信号。当终端连接断开时发送给进程,通常用于通知进程重新读取配置文件。
  4. SIGKILL (9):强制终止进程的信号。该信号无法被捕获或忽略,并且立即终止目标进程。
  5. SIGSTOP (19):暂停进程的信号。该信号无法被捕获或忽略,并且使目标进程停止执行。
  6. SIGCONT (18):恢复进程的执行信号。用于恢复由SIGSTOPSIGTSTP暂停的进程。

还有其他许多信号可以用于不同的目的,如处理错误、子进程状态更改、定时器触发等。

进程可以使用系统调用(如kill)发送信号给其他进程,也可以使用signal函数来设置自己接收信号并指定对应的处理逻辑。

实例

#include "apue.h"
#include

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%% ");
}

一、UNIX基础知识(4)_第1张图片

当按下Ctrl+C时,程序将会打印interrupt。

小结

至此,第一章UNIX基础知识已经结束,下一章将对UNIX标准及实现进行讲述。

694340007156)]

当按下Ctrl+C时,程序将会打印interrupt。

小结

至此,第一章UNIX基础知识已经结束,下一章将对UNIX标准及实现进行讲述。

你可能感兴趣的:(UNIX,unix,服务器)