当前位置: 技术问答>linux和unix
Linux中用signal在进程间通讯,如何传指针啊?
来源: 互联网 发布时间:2015-09-18
本文导语: 用sigaction安装信号 用siggueue( pid, signo, sigval_t )发送信号 sigval_t是个union类型 包含si_int和si_ptr两个域 si_int可以传过去,但是si_ptr总是传不过去,是怎么回事情啊? | si_int int 型32位,si_ptr ...
用sigaction安装信号
用siggueue( pid, signo, sigval_t )发送信号
sigval_t是个union类型
包含si_int和si_ptr两个域
si_int可以传过去,但是si_ptr总是传不过去,是怎么回事情啊?
用siggueue( pid, signo, sigval_t )发送信号
sigval_t是个union类型
包含si_int和si_ptr两个域
si_int可以传过去,但是si_ptr总是传不过去,是怎么回事情啊?
|
si_int int 型32位,si_ptr 是否32位,强制转换试试?
|
这个……
楼上各位在搞什么啊?union不就这样吗?否则就用struct了……
union的特性就是重叠所有成员的空间……
譬如
union
{ int a;int b;}c;
struct
{ int a;int b;}d;
这个里面c.a==c.b,这个是union的行为
而d.a就不一定==d.b了,这个就是struct的行为……
说白了,在楼主的问题里面si_int和si_ptr虽然类型不同,但是大小和在内存里面的位置都一样,所以就出现了两个东西相等的情况了……
楼上各位在搞什么啊?union不就这样吗?否则就用struct了……
union的特性就是重叠所有成员的空间……
譬如
union
{ int a;int b;}c;
struct
{ int a;int b;}d;
这个里面c.a==c.b,这个是union的行为
而d.a就不一定==d.b了,这个就是struct的行为……
说白了,在楼主的问题里面si_int和si_ptr虽然类型不同,但是大小和在内存里面的位置都一样,所以就出现了两个东西相等的情况了……
|
大米:按照“无法传递 *si_ptr”理解吧。
|
某人马甲的马甲的马甲问出了最关键的问题:
“一个进程把它的进程空间中的一个指针通过IPC传给另一个进程,有虾米用涅?”
我们说,Linux的每一个进程都有它自己的页表,所谓的本地页表,每个进程的地址空间都是0~3G,那么进程A中的指针P,值为虚地址VA,这个VA由进程A的页表翻译为物理地址比如PA,现在传给了进程B,B要咋办涅?B的页表里决不会有一项纪录把这个VA也解释成PA的哦,而是PB,且满足PB != PA喽。
“一个进程把它的进程空间中的一个指针通过IPC传给另一个进程,有虾米用涅?”
我们说,Linux的每一个进程都有它自己的页表,所谓的本地页表,每个进程的地址空间都是0~3G,那么进程A中的指针P,值为虚地址VA,这个VA由进程A的页表翻译为物理地址比如PA,现在传给了进程B,B要咋办涅?B的页表里决不会有一项纪录把这个VA也解释成PA的哦,而是PB,且满足PB != PA喽。