sigaction()中第二个结构(* oldact)的用途是什么

时间:2010-09-03 11:20:09

标签: c unix ubuntu

我正在尝试为c中的退出信号创建一个处理程序,我的操作系统是ubuntu。

我正在使用sigaction方法来注册我的自定义处理程序方法。

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

这是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void CustomHandler(int signo)
{
    printf("Inside custom handler");
    switch(signo)
    {
    case SIGFPE:
        printf("ERROR: Illegal arithmatic operation.\n");
        break;

    }

    exit(signo);
}

void newCustomHandler(int signo)
{
    printf("Inside new custom handler");
    switch(signo)
    {
    case SIGINT:
        printf("ERROR: Illegal arithmatic operation.\n");
        break;

    }

    exit(signo);
}

int main(void)
{
    long value;
    int i;
    struct sigaction act = {CustomHandler};
    struct sigaction newact = {newCustomHandler};


    newact = act;
    sigaction(SIGINT, &newact, NULL); //whats the difference between this

    /*sigaction(SIGINT, &act, NULL); // and this?
    sigaction(SIGINT, NULL, &newact);*/


    for(i = 0; i < 5; i++)
    {
        printf("Value: ");
        scanf("%ld", &value);
        printf("Result = %ld\n", 2520 / value);
    }
}

现在,当我运行程序并按Ctrl + c时,它会显示Inside Inside自定义处理程序。

我已阅读sigaction的文档,并说

  

如果act为非null,则为新操作   信号符号是从act安装的。   如果oldact非null,则为previous   动作保存在oldact中。

当我可以直接分配像

这样的值时,为什么需要传递第二个结构
newact = act

感谢。

2 个答案:

答案 0 :(得分:5)

oldact可用于重置上一个操作处理程序:

sigaction(SIGINT, &copyInterrupted, &previousHandler);
copy(something);
sigaction(SIGINT, &previousHandler, null);

这样,即使您不知道它是什么,也可以重置以前的信号处理程序。

答案 1 :(得分:1)

当您致电sigaction时,旧处理程序替换为新处理程序; oldact指针设置为指向此替换之前生效的处理程序信息。

或许,通常情况下,您希望新处理程序仅对代码的有限区域生效:现在您知道在更改之前配置是什么,您可以通过另一个调用来恢复它sigaction,在该地区的尽头。