2014-05-02 54 views
0

我有这样的代码:C/C++:调用一个函数退出与的sigaction()不工作

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

void exfunc(sig_t s) { 
    ... 
    exit(1); 
} 

int main(void) { 
    ... 
    sigaction(SIGINT,exfunc); 
    ... 
} 

,当我尝试编译这段代码,我得到以下错误:

main.cpp: In function 'int main()': 
main.cpp:36:25: error: cannot convert 'void (*)(sig_t) {aka void (*)(void (*)(int))}' to 'const sigaction*' for argument '2' to 'int sigaction(int, const sigaction*, sigaction*)' 

我找不到这个错误。我做错了什么?我是C/C++编程新手。

+0

这看起来像C,而不是C++。 – Brian

+0

从[我收集](http://www.gnu.org/software/libc/manual/html_node/Sigaction-Function-Example.html)中,'sigaction'是您需要填充的结构,而不是函数指针类型('sa_handler'字段似乎是函数指针所在的位置)。 – Cameron

+0

真的没有“C/C++”这样的东西。 C和C++是不同的,并且需要不同的编程风格。 –

回答

2

您可能想使用信号而不是sigaction。信号是sigaction的简化版本。

signal(SIGINT, exfunc); 

使用sigaction需要定义一个元素数组。如果你想安装几个信号处理程序,这很有用。如果你只想要一个,很多工作。 sigaction还允许访问信号的许多功能。信号被简化并且通常会做人们所期望的。

exfunc也有错误的原型。 sig_t是该函数原型类型的typedef:

typedef void (*sig_t)(int); 

此读取,sig_t是一个函数,它的int参数,并返回无效。将exfunc更改为

void exfunc(int s) { 

将允许您的程序编译。

+0

它也不工作: main.cpp:在函数'int main()': main.cpp:36:22:错误:无效转换从'void(*)(sig_t){aka void(* )('void(*)(int))}'to'__sighandler_t {aka void(*)(int)}'[-fpermissive] /usr/include/signal.h:101:23:error:initializing argument 2 of 'void(* signal(int,__sighandler_t))(int)'[-fpermissive] – Thomas131

+0

更新了描述并解决了实际问题。 :-) –

+0

你好,现在看来工作。目前我没有空的SD卡来测试Raspberry Pi上的完整程序,但是当我删除与wiringPI相关的所有内容时,它似乎可行。谢谢! – Thomas131