C 信号';s";siginfo_t*info";导致分割错误的原因

C 信号';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)中都应该是相当标

我正在制作一个程序,其中包含一个“Server.c”,等待客户端发送SIGUSR1消息10次,然后消失,还有一个“client.c”,向服务器发送SIGUSR1消息

问题是,如果我试图访问siginfo_t*info,就会出现分段错误

请注意,这是在我没有高权限的Debian ssh服务器上测试的。 这段代码在Ubuntu上运行良好

siginfo_t*info是否会因权限问题而失败?或者是其他问题导致了这种可移植性问题。据我所知,libc在所有linux发行版(可能是unix)中都应该是相当标准的

有什么想法吗

谢谢

服务器.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 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,我已经这样做了,但仍然有分段错误。有什么想法吗?如果我对访问该变量的行进行注释,则不存在错误,因此不确定发生这种情况的原因。最终找到了答案。我需要在注册到我想要处理的信号之前设置标志。。。呸!