免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10508 | 回复: 14
打印 上一主题 下一主题

用sigqueue()函数向另一个进程传递一个指针 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-08 13:49 |只看该作者 |倒序浏览
我做了一个发送信号端,一个接收信号端,可以实现向接收端传一个整型数据,但是如果改成指针的好,就提示出现段错误,segementation fault.代码如下:
发送端:C/C++ code#include <signal.h>
#include
<stdio.h>
#include
<stdlib.h>
#include
<sys/time.h>
#include
<unistd.h>
#include
<sys/types.h>
#include
<string.h>
int main(int argc,char**argv)
{
    union sigval mysigval;
   
char
* pMsg;
   
char msg[]="I still believe";
    strcpy(pMsg,msg);
    mysigval.sival_ptr
=pMsg;
//  mysigval.sival_int=8;
    pid_t pid;   
    pid
=(pid_t)atoi(argv[1]);
   
if(sigqueue(pid,SIGRTMIN,mysigval)==-1)
    printf(
"send error\n");
    sleep(
2);
   
return
1;
}



  
信号接收端代码:
C/C++ code
#include
<signal.h>
#include
<stdio.h>
#include
<stdlib.h>
#include
<sys/types.h>
#include
<unistd.h>
#include
<bits/siginfo.h>
void new_op(int signum,siginfo_t *info,void
*myact)
{
    printf(
"receive signal %d", signum);
//  char *msg=(char*)info->si_value.sival_ptr;
//  printf(" receive infomation is:%s\n",msg);

int msg=info->si_value.sival_int;
    printf(
"receive information is %d",msg);
    sleep(
5);
}
int main()
{   
    pid_t pid;
    pid
=getpid();
    printf(
"my pid is %d",pid);   
   
struct sigaction act;
    sigemptyset(
&act.sa_mask);
    act.sa_flags
=SA_SIGINFO;
    act.sa_sigaction
=new_op;
   
int result;
    result
=sigaction(SIGRTMIN,&act,NULL);
   
if(result <
0)
    {
    printf(
"install sigal error\n");
    }   
   
while(1)
    {
    sleep(
2);
    printf(
"wait for the signal\n");
    }
}




望各位大侠给支个招。

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
2 [报告]
发表于 2009-08-08 14:15 |只看该作者
语法错误你自己找 看下一这个结构体就明白了
          union sigval {
               int   sival_int;
               void *sival_ptr;
           };
指针实质上是一个整数 所以sigqueue只能传一个整数 要想传结构体 收发方要在一个进程内。解释不对请拍砖

论坛徽章:
0
3 [报告]
发表于 2009-08-08 14:47 |只看该作者
先谢谢楼上的兄弟。。。
不过我没听明白,虽然说指针本质上是一个整型,但那个sigval不是一个联合么,有一个整型,一个void 指针变量,你为什么说sigqueue()只能传一个整数呢,既然整型可以传,那void 指针变量为什么不能传给另一个进程。
而且为看sigqueue()的man page上明文写着可以在信号中附带信息,这个信息可以是一个整型,也可以是一个指针。

论坛徽章:
0
4 [报告]
发表于 2009-08-08 14:50 |只看该作者
还有就是你说的那个 :“要想传结构体 收发方要在一个进程内”  这个楼上的兄弟你能确定不。。。

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
5 [报告]
发表于 2009-08-08 15:48 |只看该作者

回复 #3 a263238386 的帖子

指针传肯定能传的 但一个进程内的指针另外一个进程能不能读就另一回事了。一个进程内的应该没问题的。

还有你那个程序我也试了,我发SIGUSR1信号也能传参数,这个你知道为什么?

论坛徽章:
0
6 [报告]
发表于 2009-08-08 16:18 |只看该作者
char* pMsg;
    char msg[]="I still believe";
    strcpy(pMsg,msg);//这儿就可能挂了,如果没挂的话,程序有没问题还要看人品。

基础太差了,打好基础再整吧。

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
7 [报告]
发表于 2009-08-08 16:33 |只看该作者
原来sigqueue也支持非实进信号

[ 本帖最后由 vbs100 于 2009-8-8 16:45 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-08-08 17:08 |只看该作者
呵呵。。我知道了。。应该是两个进程的虚拟地址空间不同,传过去的指针值不是真实的内存地址,所以读不出来。。是这样么。。精灵王

论坛徽章:
0
9 [报告]
发表于 2009-08-08 17:09 |只看该作者
原帖由 justkain 于 2009-8-8 16:18 发表
char* pMsg;
    char msg[]="I still believe";
    strcpy(pMsg,msg);//这儿就可能挂了,如果没挂的话,程序有没问题还要看人品。

基础太差了,打好基础再整吧。



呵呵。这位兄弟。。。我的程序可以跑阿。。没有挂阿。。莫非是我的人品好。。。你来说说跑到这为什么会挂。。。。

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
10 [报告]
发表于 2009-08-09 03:16 |只看该作者

回复 #8 a263238386 的帖子

嗯是这个意思 我没说清楚。还有除了传指针这个问题 justkain说的也对啊,你向一个未申请内存的指针拷数据肯定是不对的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP