如何接收 sigqueue() 系统调用发送的数据

Posted

技术标签:

【中文标题】如何接收 sigqueue() 系统调用发送的数据【英文标题】:How do I receive data sent by sigqueue() syscall 【发布时间】:2013-08-31 13:01:30 【问题描述】:

我有 2 个进程 sigserver 和 sigclient。 sigserver 等待信号到来,sigclient 将数据(int+char)发送到 sigserver。

sigserver.c

void sighand(int signo, siginfo_t *info, void *extra)

       void *ptr_val = info->si_value.sival_ptr;
       int int_val = info->si_value.sival_int;
       printf("Signal: %d, value: [%d] %s\n", signo, int_val, (char*)ptr_val);


int main()

        struct sigaction action;

        action.sa_flags = SA_SIGINFO;
        action.sa_sigaction = &sighand;

        if (sigaction(SIGUSR2, &action, NULL) == -1) 
                perror("sigusr: sigaction");
                return 0;
        

        printf("Signal handler installed, waiting for signal\n");

        while(1) sleep(2);

        return 0;

sigclient.c

int main(int argc, char *argv[])

        union sigval value;
        int pid = atoi(argv[1]);

        value.sival_int = atoi(argv[2]);
        value.sival_ptr = (void*) strdup(argv[3]);
        if(sigqueue(pid, SIGUSR2, value) == 0) 
                printf("signal sent successfully!!\n");
         else 
                perror("SIGSENT-ERROR:");
        
        return 0;

现在当我使用以下命令运行客户端时 ./client server_pid 15 teststring

服务器生成核心转储。

我的问题是,一个进程如何读取另一个进程(不是子进程)发送的字符串。

【问题讨论】:

注意:sigvalunion,这意味着您可以设置sival_intsival_ptr,但不能同时设置!请参阅Purpose of Unions in C and C++ 和Unions in C 了解更多信息。 【参考方案1】:

通过sival_ptr 的值从一个进程发送到另一个进程的地址在接收进程中无效,因为两个进程共享相同的地址空间。

由于在访问sival_ptr 时,接收方会调用这种未定义的行为。

示例中使用的逻辑只有在接收者和发送者是相同的进程并因此使用相同的地址空间时才有效。

注意:与sival_ptr 相比,sival_int 的值可用于接收方,因为它的值数据。


要从一个进程向另一个进程发送比单个整数更复杂的数据,请使用不同的 IPC 机制,例如共享内存、套接字、管道……

【讨论】:

thts wt 我在想 abt,但不确定,谢谢确认。

以上是关于如何接收 sigqueue() 系统调用发送的数据的主要内容,如果未能解决你的问题,请参考以下文章

函数sigsuspend

10.20 sigqueue函数

信号的发送kill,raise,alarm,setitimer,abort,sigqueue

siginfo中的数据可信吗?

有没有办法通过信号发送值

无法使用 gcc 构建 sigqueue 示例,但 g++ 可以吗?