[英]How do I receive a signal sent with sigqueue in a c program (on linux)?
[英]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.