免费注册 查看新帖 |

Chinaunix

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

如何实现类似qt里的emit,signal -》 slot? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-13 20:43 |只看该作者 |倒序浏览
比如子进程为signal,父进程为slot,子进程处理事情发生状态变化时通知父进程,怎么做到?

谢谢

论坛徽章:
0
2 [报告]
发表于 2008-11-13 22:54 |只看该作者
原帖由 john.daker 于 2008-11-13 20:43 发表
比如子进程为signal,父进程为slot,子进程处理事情发生状态变化时通知父进程,怎么做到?

谢谢


子进程 kill (getppid (), signal);

论坛徽章:
0
3 [报告]
发表于 2008-11-13 23:04 |只看该作者
谢谢,但是信号好像会丢失,并且qt里的signal,slot可以发送变量,但是kill不可以传送值给父进程
#include <signal.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>

void sig_handle(int signum)
{
        if(signum==10){
            printf("i'm handle and pid=%d\n",getpid());
                sleep(1);
        }
}

int main(int argc,char *argv[])
{
    pid_t child;
    signal(10,sig_handle);
    child=fork();
    if(child==0)
    {
                sleep(2);
            printf("i'm child and pid=%d\n",getpid());
                int i=10;
                while(i--){
                        kill(getppid(),10);
                }
                sleep(1000);
    }
        printf("i'm parent and pid=%d\n",getpid());
        while(1){
                sleep(2);
        }
    return 0;
}


[ 本帖最后由 john.daker 于 2008-11-13 23:08 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-11-13 23:28 |只看该作者
我觉得不一定非得要用信号,你可以用管道。每次子进程发生了什么动作,可以往管道里面写东西,格式约定好就行。父进程监听管道,一旦有事件发生,就可以马上采取动作。
你说的信号丢失的问题,是因为一般的系统实现信号是不排队的。相同的信号会有丢失。
不过没有关系,信号仅仅是通知的父进程进行读取。可以做出如下的约定:
1,子进程发送信号给父进程
2,子进程把改变的状态信息写入管道(按照一个固定的格式,或者约定一个协议)
3,父进程按照一格式去读取管道(比如,父进程收到信号后读取管道,你可以用select带超时控制),确保父进程不会阻塞在管道读取上)。每读取到一个记录,做相应的处理。这个可以在信号处理函数中设定。注意,一定要用sigaction来设置,以防止信号抖动。
4,至于父进程在处理中是否必须在某些关键点屏蔽信号处理,如果必要,用sigprocmask设定一下,回头在放开就可以。

基本上应该可以满足要求了吧

论坛徽章:
0
5 [报告]
发表于 2008-11-13 23:39 |只看该作者
恩,我试试看,谢谢阿~不过能做到信号排队就好了

论坛徽章:
0
6 [报告]
发表于 2008-11-16 21:29 |只看该作者
楼主google下sigslot
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP