1

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

3 回答 3

2

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

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

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

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

现在请考虑一下您在那里写了什么以及编译器如何解释它。函数参数按值传递。所以表达式 signal_handler(...) 被评估并将结果传递给信号。这不是您想要的,您希望使用您在 SIGINT 到达时传递的参数调用 signal_handler。但这不是这条线所表达的。它表达的意思是:现在用参数调用signal_handler,并将this的结果作为handler参数传递给signal,以便稍后在SIGINT到达时调用。

于 2012-08-21T19:59:35.463 回答
0

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

所以你的电话应该是

signal(SIGINT,&signal_handler);

那么,signal_handler 应该被定义为

typedef void (*sighandler_t)(int);

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

于 2012-08-21T19:59:35.687 回答
-1

据我所知,signal 需要一个指向带有 int 参数的 void 函数的指针。我不知道任何超载会让你。

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

于 2012-08-21T19:50:58.207 回答