gpt4 book ai didi

c - 信号的 "siginfo_t* info"导致段错误

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

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

问题是,如果我尝试访问 siginfo_t* 信息,我会遇到段错误。

请注意,这是在我没有高权限的 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;
}

客户端.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;
}

我尝试将 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;
}

现在它根本不再接收 SIGUSR1 事件。

最佳答案

sigaction 的基本行为是调用一个简单的回调,如:void (*sa_handler)(int);。因此,如果您想使用带有 3 个参数的 sigaction 句柄 void (*sa_sigaction)(int, siginfo_t *, void *);,您必须使用标志 SA_SIGINFO 设置 struct sigaction 的 sa_flags 字段。查看手册页:http://www.kernel.org/doc/man-pages/online/pages/man2/sigaction.2.html谁清楚。

关于c - 信号的 "siginfo_t* info"导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15148714/

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