我可以将参数传递给SIGINT吗

Can I pass arguments to SIGINT?

本文关键字:SIGINT 参数传递 我可以      更新时间:2023-10-16

我正试图传递一些额外的参数,以便在程序的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));

这真的可以实现吗?还是我被误导了?

要实现这一点,您需要一个名为闭包的构造,C和C++都没有内置闭包。但是,您可以使用ffcall库实现闭包行为。其思想是从通用处理程序和传递给该函数的参数中构建一个原位函数。当然,即使保留了作用域,这些参数也必须保持有效,这意味着,要么将它们作为全局变量,要么将其分配到堆中。

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

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

现在请想想你在那里写了什么,以及编译器是如何解释的。函数参数按值传递。因此,对表达式signal_handler(…)进行求值,并将结果传递给signal。这不是您想要的,您希望在SIGINT到达时使用传递的参数来调用signal_handler。但这并不是这句话所表达的。它表示的是:现在用参数调用signal_handler,并将其结果作为处理程序参数传递给信号,以便在SIGINT到达时进行后续调用

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

所以你的电话应该是

signal(SIGINT,&signal_handler);

然后,signal_handler应定义为

typedef void (*sighandler_t)(int);

这是一个函数,只需要一个参数-信号号。此外,由于信号是从外部发射到程序的,所以您不可能传递额外的参数。

据我所知,signal使用一个指向带int参数的void函数的指针。我不知道有什么超载会让你失望的。

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