C 信号';s";siginfo_t*info";导致分割错误的原因
我正在制作一个程序,其中包含一个“Server.c”,等待客户端发送SIGUSR1消息10次,然后消失,还有一个“client.c”,向服务器发送SIGUSR1消息 问题是,如果我试图访问siginfo_t*info,就会出现分段错误 请注意,这是在我没有高权限的Debian ssh服务器上测试的。 这段代码在Ubuntu上运行良好 siginfo_t*info是否会因权限问题而失败?或者是其他问题导致了这种可移植性问题。据我所知,libc在所有linux发行版(可能是unix)中都应该是相当标准的 有什么想法吗 谢谢 服务器.cC 信号';s";siginfo_t*info";导致分割错误的原因,c,libc,C,Libc,我正在制作一个程序,其中包含一个“Server.c”,等待客户端发送SIGUSR1消息10次,然后消失,还有一个“client.c”,向服务器发送SIGUSR1消息 问题是,如果我试图访问siginfo_t*info,就会出现分段错误 请注意,这是在我没有高权限的Debian ssh服务器上测试的。 这段代码在Ubuntu上运行良好 siginfo_t*info是否会因权限问题而失败?或者是其他问题导致了这种可移植性问题。据我所知,libc在所有linux发行版(可能是unix)中都应该是相当标
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
int counter = 0;
pid_t *clients = 0;
void on_signal(int signo, siginfo_t *info, void * context)
{
puts("SIGNAL RECEIVED");
assert(clients);
clients[counter] = info->si_pid;
++counter;
}
int main()
{
struct sigaction action;
sigset_t set;
int recieveflag = 0;
clients = (pid_t*)malloc(10 * sizeof(pid_t));
sigemptyset(&set);
sigaddset(&set, SA_SIGINFO);
memset(&action, 0, sizeof(struct sigaction));
action.sa_sigaction = on_signal;
sigaction(SIGUSR1, &action, 0);
while (counter < 10) {
//sigprocmask(SIG_BLOCK, &set, 0);
sigsuspend(&set);
}
puts("I'm done!");
return 0;
}
#包括
#包括
#包括
#包括
#包括
int计数器=0;
pid_t*客户端=0;
信号无效(int signo、siginfo\U t*info、void*context)
{
看跌期权(“收到信号”);
断言(客户);
客户机[计数器]=info->si_pid;
++计数器;
}
int main()
{
结构动作;
sigset\u t集;
int ReceiveFlag=0;
客户=(pid_t*)malloc(10*sizeof(pid_t));
sigpemptyset(&set);
sigaddset(&set,SA_SIGINFO);
memset(&action,0,sizeof(struct-sigaction));
action.sa_sigaction=开启信号;
sigaction(SIGUSR1,&action,0);
while(计数器<10){
//sigprocmask(SIG_块和集,0);
sigsupspend(&set);
}
puts(“我完成了!”);
返回0;
}
客户c:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
int main(int argc, const char** argv)
{
int server_id;
assert(argc == 2);
server_id = atoi(argv[1]);
assert(server_id > 0);
kill(server_id, SIGUSR1);
return 0;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,常量字符**argv)
{
int server_id;
断言(argc==2);
服务器id=atoi(argv[1]);
断言(服务器id>0);
kill(服务器id,SIGUSR1);
返回0;
}
我尝试编辑server.c以:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
int counter = 0;
pid_t *clients = 0;
void on_signal(int sig)
{
puts("SIGNAL RECEIVED");
}
int main()
{
struct sigaction action;
sigset_t set;
int recieveflag = 0;
clients = (pid_t*)malloc(10 * sizeof(pid_t));
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
memset(&action, 0, sizeof(struct sigaction));
action.sa_flags = SA_SIGINFO;
action.sa_handler = on_signal;
sigaction(SIGUSR1, &action, 0);
while (counter < 10) {
sigprocmask(SIG_BLOCK, &set, 0);
sigsuspend(&set);
++counter;
}
puts("I'm done!");
return 0;
}
#包括
#包括
#包括
#包括
#包括
int计数器=0;
pid_t*客户端=0;
信号无效(int sig)
{
看跌期权(“收到信号”);
}
int main()
{
结构动作;
sigset\u t集;
int ReceiveFlag=0;
客户=(pid_t*)malloc(10*sizeof(pid_t));
sigpemptyset(&set);
sigaddset(&set,SIGUSR1);
memset(&action,0,sizeof(struct-sigaction));
action.sa_flags=sa_SIGINFO;
action.sa_handler=打开_信号;
sigaction(SIGUSR1,&action,0);
while(计数器<10){
sigprocmask(SIG_块和集,0);
sigsupspend(&set);
++计数器;
}
puts(“我完成了!”);
返回0;
}
现在它不再接收SIGUSR1事件了。sigaction的基本行为是调用一个简单的回调,比如:
void(*sa_handler)(int)代码>。因此,如果您想使用带有3个参数的sigaction句柄void(*sa_sigaction)(int,siginfo_t*,void*)代码>,则必须使用标志sa_SIGINFO设置struct sigaction的sa_标志字段。查看手册页:谁是清楚的。sigaction的基本行为是调用一个简单的回调,如:void(*sa_handler)(int)代码>。因此,如果您想使用带有3个参数的sigaction句柄void(*sa_sigaction)(int,siginfo_t*,void*)代码>,则必须使用标志sa_SIGINFO设置struct sigaction的sa_标志字段。看一下手册页:谁是清楚的。对不起,我看不出它设置在哪里。如果您的意思是将其设置为'sigaddset(&set,SA_SIGINFO);`,sigaddset只需创建一个信号列表。进入信号装置。因此,这不会在struct sigaction上设置任何字段。您的sigaddset上也有一个错误,您添加了位标志SA_SIGINFO的定义,但这不是一个信号……我发现了,这看起来确实是这样。@Hulor,我已经这样做了,但仍然有分段错误。有什么想法吗?如果我对访问该变量的行进行注释,则不存在错误,因此不确定发生这种情况的原因。最终找到了答案。我需要在注册到我想要处理的信号之前设置标志。。。呸!对不起,我看不出放在哪里。如果您的意思是将其设置为'sigaddset(&set,SA_SIGINFO);`,sigaddset只需创建一个信号列表。进入信号装置。因此,这不会在struct sigaction上设置任何字段。您的sigaddset上也有一个错误,您添加了位标志SA_SIGINFO的定义,但这不是一个信号……我发现了,这看起来确实是这样。@Hulor,我已经这样做了,但仍然有分段错误。有什么想法吗?如果我对访问该变量的行进行注释,则不存在错误,因此不确定发生这种情况的原因。最终找到了答案。我需要在注册到我想要处理的信号之前设置标志。。。呸!