我可以将参数传递给SIGINT吗?

时间:2012-08-21 19:49:17

标签: c++ arguments sigint

我正在尝试传递一些额外的参数,以便它们可以在我的程序上的SIGINT调用中使用,但是我收到编译错误,这实际上是可以实现还是我被误导了?

如果可以实现,有人可以在这里解释我的错误;

void signal_handler(bool &txMode, char* &txData, int &sendresult, int &sockFD,_
char* &txBuffer, struct sockaddr_ll &socket_address);

int main(int argc, char *argv[]) {
    unsigned char sourceMAC[6];
    unsigned char destMAC[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
    bool txMode = true;
    char* txBuffer = (char*)operator new(ETH_FRAME_LEN);
    unsigned char* txEtherhead = (unsigned char*)txBuffer;
    struct ethhdr *eh = (struct ethhdr *)txEtherhead;
    int sockFD;
    char* txData = txBuffer + headersLength;
    struct sockaddr_ll socket_address;
    int sendresult = 0;

    signal (SIGINT,signal_handler(txMode, txData, sendresult, sockFD, txBuffer,_
    socket_address));

    return 0;
}

void signal_handler(bool &txMode, char* &txData, int &sendresult, int &sockFD,_
char* &txBuffer, struct sockaddr_ll &socket_address) {

  if(txMode==true) {
    std::string param;
    std::stringstream ss;
    ss << "etheratedeath";
    param = ss.str();
    strncpy(txData,param.c_str(), param.length());
    sendresult = sendto(sockFD, txBuffer, ETH_FRAME_LEN, 0, 
             (struct sockaddr*)&socket_address, sizeof(socket_address));
  }
  cout << "You killed me!" << endl;
}

我在编译时遇到以下错误;

user@machine:~/c/ethernet1$ gcc -o ethernet1 ethernet1.cpp -lrt
ethernet1.cpp: In function ‘int main(int, char**)’:
ethernet1.cpp:358: error: invalid use of void expression

在main()中引用这一行;

signal (SIGINT,signal_handler(txMode, txData, sendresult, sockFD, txBuffer, socket_address));

3 个答案:

答案 0 :(得分:2)

  

这实际上是可以实现还是我被误导了?

为此,你需要一个名为 closure 的结构,C和C ++都没有内置的闭包。但是你可以使用ffcall库实现闭包行为。我们的想法是从通用处理程序和要传递给该函数的参数构建一个原位函数。当然,即使保留范围,参数也必须保持有效,这意味着要么将它们作为全局变量,要么在堆上分配它们。

  

我在编译时遇到以下错误;   (...)

signal (SIGINT,signal_handler(txMode, txData, sendresult, sockFD, txBuffer, socket_address));

现在请考虑一下你在那里写的内容以及编译器如何解释这一点。函数参数按值传递。因此评估表达式signal_handler(...)并将结果传递给信号。这不是你想要的,你希望用SIGINT到达时传递的参数调用signal_handler。但这不是,这条线表达了什么。它表达的是:现在使用参数调用signal_handler,并将此结果作为处理程序参数传递给SIGINT到达时稍后调用的信号。

答案 1 :(得分:0)

当你致电signal时,你没有调用信号处理程序,你给定信号与适当的处理程序联系起来。

所以你的电话应该是

signal(SIGINT,&signal_handler);

然后,signal_handler应定义为

typedef void (*sighandler_t)(int);

这是一个只接受1个参数的函数 - 信号编号。此外,由于信号从程序外部发出,因此您无法传递其他参数。

答案 2 :(得分:-1)

据我所知,signal使用int参数获取指向void函数的指针。我不知道任何超载会让你感到高兴。

http://www.cplusplus.com/reference/clibrary/csignal/signal/