当前位置: 技术问答>linux和unix
发送信号以指针作为数据的问题
来源: 互联网 发布时间:2016-03-08
本文导语: /* reader.c */ #include #include #include void handler(int signo,siginfo_t* si,void* context); int main(int argc,char** argv) { struct sigaction act; char tem; act.sa_sigaction=handler; act.sa_flags=SA_SIGINFO; ...
/* reader.c */
#include
#include
#include
void handler(int signo,siginfo_t* si,void* context);
int main(int argc,char** argv)
{
struct sigaction act;
char tem;
act.sa_sigaction=handler;
act.sa_flags=SA_SIGINFO;
printf("%dn",getpid());
sigaction(SIGUSR1,&act,NULL);
tem=getchar();
printf("%cn",tem);
return 0;
}
void handler(int signo,siginfo_t* si,void* context)
{
char* str;
int i;
int* in;
if(SIGUSR1!=signo)
{
return;
}
printf("%dn",si->si_value.sival_int);
in=(int*)si->si_value.sival_int;
printf("%dn",*in);
}
/* writer.c */
#include
#include
#include
int main(int argc,char** argv)
{
int id;
char* str="Hello leaxujia!n";
int in=10086;
union sigval val;
if(2!=argc)
{
printf("usage:writer pidn");
return 1;
}
id=atoi(argv[1]);
val.sival_int=(int)∈
printf("%dn",val.sival_int);
printf("%dn",*(int*)val.sival_int);
sigqueue(id,SIGUSR1,val);
getchar();
return 0;
}
编译完成后,从一个终端输入:
$ ./reader
6641
然后从另一个终端输入:
$ ./writer 6641
-1076204440
10086
现在原先的终端接到消息后,输出:
-1076204440
段错误
然后退出了。
现在我就搞不懂,为什么它的指针都原样的发送过去了
但是就是读不对呢?为什么会出现段错误?
是不是一个进程的数据不能接受另一个进程来读啊?
但是要事这样的话,
union sigval中含有一个void* sival_ptr有什么用,这个东西不就是用来发送指针的吗?
不解。
等高手解答。
#include
#include
#include
void handler(int signo,siginfo_t* si,void* context);
int main(int argc,char** argv)
{
struct sigaction act;
char tem;
act.sa_sigaction=handler;
act.sa_flags=SA_SIGINFO;
printf("%dn",getpid());
sigaction(SIGUSR1,&act,NULL);
tem=getchar();
printf("%cn",tem);
return 0;
}
void handler(int signo,siginfo_t* si,void* context)
{
char* str;
int i;
int* in;
if(SIGUSR1!=signo)
{
return;
}
printf("%dn",si->si_value.sival_int);
in=(int*)si->si_value.sival_int;
printf("%dn",*in);
}
/* writer.c */
#include
#include
#include
int main(int argc,char** argv)
{
int id;
char* str="Hello leaxujia!n";
int in=10086;
union sigval val;
if(2!=argc)
{
printf("usage:writer pidn");
return 1;
}
id=atoi(argv[1]);
val.sival_int=(int)∈
printf("%dn",val.sival_int);
printf("%dn",*(int*)val.sival_int);
sigqueue(id,SIGUSR1,val);
getchar();
return 0;
}
编译完成后,从一个终端输入:
$ ./reader
6641
然后从另一个终端输入:
$ ./writer 6641
-1076204440
10086
现在原先的终端接到消息后,输出:
-1076204440
段错误
然后退出了。
现在我就搞不懂,为什么它的指针都原样的发送过去了
但是就是读不对呢?为什么会出现段错误?
是不是一个进程的数据不能接受另一个进程来读啊?
但是要事这样的话,
union sigval中含有一个void* sival_ptr有什么用,这个东西不就是用来发送指针的吗?
不解。
等高手解答。
|
现在我就搞不懂,为什么它的指针都原样的发送过去了
但是就是读不对呢?为什么会出现段错误?
是不是一个进程的数据不能接受另一个进程来读啊?
===================================
对,进程间不能 读其他进程的内存.
要实现你的需求, 可以考虑使用共享内存.
PS: 不是没人回答你的问题,今天是周末.
但是就是读不对呢?为什么会出现段错误?
是不是一个进程的数据不能接受另一个进程来读啊?
===================================
对,进程间不能 读其他进程的内存.
要实现你的需求, 可以考虑使用共享内存.
PS: 不是没人回答你的问题,今天是周末.
|
共享内存为什么不行?
共享内存可以被多个进程共享,进程间不需要有什么联系,只要这几个进程是同一台机器上运行。
共享内存可以被多个进程共享,进程间不需要有什么联系,只要这几个进程是同一台机器上运行。
|
看不懂。那就CD(纯顶一下)
|
这个union sigval 一次只能传一个整数或一个指针,而你认为一次能传两个.