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

Joh*_*hnG 4 c signals ipc sigqueue

我有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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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

服务器生成核心转储.

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

alk*_*alk 11

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

由于访问时在接收方调用此未定义的行为sival_ptr.

所示示例中使用的逻辑仅在接收器和发送器是相同的进程时才起作用,因此使用相同的地址空间.

注意:与可以在接收器端使用sival_ptr的值相反sival_int,因为它的值数据.


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