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

C++ 我可以将参数传递给SIGINT吗?,c++,arguments,sigint,C++,Arguments,Sigint,我试图传递一些额外的参数,以便它们可以在我的程序的SIGINT调用中使用,但是我得到了一个编译错误,这实际上是可以实现的还是我得到了错误的信息 如果可以实现,请有人在这里解释我的错误 void signal_handler(bool &txMode, char* &txData, int &sendresult, int &sockFD,_ char* &txBuffer, struct sockaddr_ll &socket_address);

我试图传递一些额外的参数,以便它们可以在我的程序的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;
}
指main()中的这一行


据我所知,signal接受指向带有int参数的void函数的指针。我不知道有什么超载会让你

这真的是可以实现的还是我得到了错误的信息

此,需要一个称为闭包的构造,C和C++都没有内置的闭包。但是,您可以使用库实现闭包行为。其思想是从通用处理程序和要传递给该函数的参数构建一个原位函数。当然,参数必须保持有效,即使保留了作用域,也就是说,要么让它们成为全局变量,要么在堆上分配它们

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


现在请考虑一下您在那里写了什么,以及编译器是如何解释的。函数参数按值传递。所以表达式signal_处理程序(…)被计算,结果被传递给signal。这不是您想要的,您希望使用SIGINT到达时传递的参数调用signal_处理程序。但这不是这句话所表达的。它表示的是:现在用参数调用signal\u handler,并将此结果作为handler参数传递给signal,以便在SIGINT到达时稍后调用。

当您调用
signal
时,您不调用signal handler,而是将给定的信号与相应的处理程序关联

所以你的电话应该是

signal(SIGINT,&signal_handler);
然后,信号处理器应定义为

typedef void (*sighandler_t)(int);

它是一个函数,只接受一个参数-信号号。此外,由于信号是从外部发送到程序的,因此无法传递其他参数。

signal\u handler
只能接受一个参数,该参数是表示所引发信号的整数(例如SIGINT)。SIGINT是一个宏。我害怕0A0D,那么我还有什么选择,全局变量?我是反对的,因为我有这么多的参考?你觉得怎么样?我可以把当前在signal_handler()中的代码移到另一个函数中,让signal_handler()在退出之前调用另一个函数吗?使用全局变量避免了对ffcall库的需要。谢谢你这样分解它,非常感谢:)
signal (SIGINT,signal_handler(txMode, txData, sendresult, sockFD, txBuffer, socket_address));
signal(SIGINT,&signal_handler);
typedef void (*sighandler_t)(int);