gpt4 book ai didi

c++ - 编写信号处理程序时出现编译器错误(从 ‘void (*)()’ 到‘__sighandler_t {aka void (*) 的无效转换)

转载 作者:太空宇宙 更新时间:2023-11-04 06:03:08 25 4
gpt4 key购买 nike

我编写了一个程序,它从命名管道读取数据,在五次读取后,它会打印最近五次读取的内容。我想编写一个 SIGTERM Handler 来在关闭时清理队列。但是当我编写处理程序时,g++ 给了我这个错误:

invalid conversion from ‘void ()()’ to ‘__sighandler_t {aka void ()(int)}

queue<string> q;
void cleanup(){
while(!q.empty()){
cout<<q.front()<<endl;
q.pop();
}
}
int main(){
signal(SIGTERM, cleanup);
int fd = open("named-pipe", O_RDONLY, 0);
char readbuf[80];
while(1){
int n=read(fd, &readbuf, sizeof(readbuf));
readbuf[n]=0;
q.push(string(readbuf));
if(q.size()>=5)
while(!q.empty()){
cout<<q.front()<<endl;
q.pop();
}
}
}

最佳答案

您的信号处理函数的签名不正确。它应该采用 int 参数。

void cleanup(int signal_number){
...

}

参见signal's文档。

您的信号处理程序逻辑也很可疑并且可能不正确。不允许您从信号处理程序调用异步信号不安全函数。 coutpop 异步信号安全吗?

主程序循环并调用pop。如果信号在 main 中的 pop 调用中间到达怎么办?您将再次调用pop,并且队列可能处于不一致的状态。

关于c++ - 编写信号处理程序时出现编译器错误(从 ‘void (*)()’ 到‘__sighandler_t {aka void (*) 的无效转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49486793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com