簡體   English   中英

我如何接收sigqueue()系統調用發送的數據

[英]How do I receive data sent by sigqueue() syscall

我有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

服務器生成核心轉儲。

我的問題是,進程如何讀取由另一個進程(而不是子進程)發送的字符串。

通過sival_ptr的值從一個進程發送到另一個進程的地址在接收進程中無效,因為這兩個進程共享相同的地址空間。

由於在訪問sival_ptr時在接收器端調用了這種未定義的行為。

所示示例中使用的邏輯僅在接收器和發送器是相同的進程時才起作用,因此使用相同的地址空間。

注:在對比sival_ptr的值sival_int可以在接收器側使用,因為它的值數據。


要從一個進程向另一個進程發送比單個整數更復雜的數據,請使用不同的IPC機制,如共享內存,套接字,管道......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM