我可以将参数传递给SIGINT吗
Can I pass arguments to 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));
这真的可以实现吗?还是我被误导了?
要实现这一点,您需要一个名为闭包的构造,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/
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用指向成员的指针将成员函数作为参数传递
- 如何将参数传递给正在使用模板的类
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将部分流作为参数传递
- 我正在开发服务器,ip作为参数传递不起作用
- 将成员函数指针作为参数传递给模板方法
- 如何在C++中将迭代器作为函数参数传递
- 将附加参数传递给使用 beast::bind_front_handler 调用的函数
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 将参数传递为"const"的奇怪效果
- 如何在 c++ 中将函数作为参数传递?
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- 使用引用与指针将数组作为参数传递
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 为什么我不能将引用作为 std::async 的函数参数传递
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 将__device__ lambda 作为参数传递给 __global__ 函数