论坛风格切换切换到宽版
  • 882阅读
  • 5回复

[问题求助]进程间信号传递问题 [复制链接]

上一主题 下一主题
离线daofeng99.
 
发帖
2012
C币
-152620
威望
379
贡献值
1
银元
-5
铜钱
4612
人人网人气币
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-05-01
http://upload.bbs.csuboy.com/Mon_1004/126_6985_cb9d6bcafda57bd.gif[/img]电影
下面是一个服务器程序的.一个函数的片段,用于向客户端发送数据后等待应答.。教育
由于读socket会.阻塞,我用一个字进程等数据,得到后就向父进程法SIGA.LRM信号。投资
父进程则设置一个空的handle.r()后就睡眠。投资
我用简单的小程.序测试时,.父进程在睡眠结束前收到子进程的信号就会处理,并继续执行。.
但是.这函数中,不.知道为什么,父进程就是收不到子进程的信号,外贸
过路的大侠们帮我看看吧
if((pid = fork()) < 0.)          .              // 创建子进程[成人用品]
{
        printf("fork error\n";http://upload.bbs.csuboy.com/Mon_1004/126_6985_94b8e503d334f2e.gif[/img].
        .exit(1);           女人
}
else if(pid == 0)            .            //. 子进程    外汇
{
        if(recvfrom(sock, rdata, siz.eof(struct udp_data), 0, from, f.romlen) == -1)// 监听socket.,注意如果没有数据到来,这里处于阻塞状态服务器
        {
                printf("recvfrom error\n";http://upload.bbs.csuboy.com/Mon_1004/126_6985_94b8e503d334f2e.gif[/img]--- 印刷
      .          exit(1);        .                        [成人用品]
        }
        creat("tempfile", PERMS);               . // 创建 临时.文件用.来与父进程通信,将收到的数据传送给父进程    健康
        fd = open(".t.empfile", O_WRONLY);服务器
        .write(fd, rdata, sizeof(struct udp_data));        // 将数据写入临时.文件.
        c.lose(fd);             电子

        kill(getppid()., SIGALRM.);--------------彩票

      .  exit(0);          .      //may be useles.s                                                                 .
}
else        
{
        signal(SIGALR..M, handler);投资
        usleep(.500 * 1.000);    美容
                  .          美容
        if((fd = open("tempfile.", O_.RDONLY)) == -1) // 尝试打开临时文件,取得数据.
        {
  .              // 文件还没有生成.,说明没有收到数据电脑
          .      ack = 0;服务器
                kill(pid, SIGTSTP);        // 超时则重发,.重.新计时.
                .break;外贸
        .        .
        }
        else
        {
     .           // 得到临时文件           建材
                if(read(fd, rdata, s.izeof(struct udp_data).) == 0)    外汇
        .        {外贸
             .   .        exit(1);             电子
  .              }<性病>
          .      c.lose(fd);.
                unlink("tempfile";                // 删除临时文件http://upload.bbs.csuboy.com/Mon_1004/126_6985_94b8e503d334f2e.gif[/img]              乙肝
         .  .     if((rdata->kod == RESPONSE).&&(rdata->ack_num == sdata->seq_num)) // 是否是期待的应答?虚拟主机
.               {
    .               .     ack = 1;服务器
                       . brea.k;<性病>
            .    }           建材
              .  else.
              .  {--- 印刷
   .                     //不是, .重发    外汇
         .         .      ack = 0;服务器
       .                 kill(pi.d, SIGTSTP);    外汇
      .              .    break;          婚庆
  .              }             汽车
        }
}

评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
离线ac2004.
发帖
2062
C币
-60745
威望
376
贡献值
1
银元
-1
铜钱
4591
人人网人气币
0
只看该作者 沙发  发表于: 2010-04-13
我弄明白了,是因为父进程没有来得及接受信号,在 子进程的 kill前面 加了个usleep(100)就好了
不过这个 100 是我蒙的,
理论上没有 100%的把握这个时间够用,系统要是繁忙,可能是不够的。
应该还有更可靠的方法保证父进程能接受到信号, 大家积极发表意见 阿

离线sisikie.
发帖
2119
C币
-60363
威望
375
贡献值
1
银元
-7
铜钱
4641
人人网人气币
0
只看该作者 板凳  发表于: 2010-04-13
把 signal(SIGALRM, handler); 放到fork之前试试

离线tomsina.
发帖
2065
C币
-140211
威望
356
贡献值
1
银元
-1
铜钱
4481
人人网人气币
0
只看该作者 地板  发表于: 2010-04-13
用管道通信不好吗?

发帖
1977
C币
-152657
威望
342
贡献值
1
银元
0
铜钱
4441
人人网人气币
0
只看该作者 4楼 发表于: 2010-04-13
pthread 不更简单?

发帖
2043
C币
-235292
威望
375
贡献值
1
银元
-3
铜钱
4576
人人网人气币
0
只看该作者 5楼 发表于: 2010-04-13


QUOTE:原帖由 ksksks 于 2006-2-20 21:11 发表

下面是一个服务器程序的一个函数的片段,用于向客户端发送数据后等待应答。
由于读socket会阻塞,我用一个字进程等数据,得到后就向父进程法SIGALRM信号。
父进程则设置一个空的handler()后就睡眠。
...

关注ing

快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个