免费注册 查看新帖 |

Chinaunix

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

又有问题~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-27 13:32 |只看该作者 |倒序浏览
我们系统有一个命令omctrl,他的运行过程是这样的:
首先fork出一个子进程
在子进程里忽略了所有SIGHUP,SIGTSTP,SIGSTOP,SIGTTIN,SIGTOU等信号,然后作为守护进程进入后台运行。
父进程就退出。
omctrl命令是原有的,我们没代码,改不了。

现在存在一个这样的问题:
我根据《unix高级编程》介绍的pty写了一个协作进程程序。
在pty子进程里用system调用omctrl
然后父进程再fork出一个子进程来读终端输入,并通过写pty的设备文件输入给omctrl
父进程就进入while循环不断读pty子进程的输出。(1)
但omctrl进入后台运行后,一直都不退出来,所以(1)那个循环也退不了出来。
我现在想这样,omctrl运行后,进入后台的就不理了,让(1)的while能退出来。

下面是部分代码:

server(int iReadFd,int iWriteFd)
{
   while(1)
   {
      read(iReadFd,scmd,1024);
      if(memcmp(scmd,"exit",4)==0)
         break;
      ptypid=ptyfork()
      if(ptypid==0)
      {
            system(scmd);
      }
      else if(ptypid>0)
     {
            pIDRd=fork();
            if(pIDRd==0)
            {
                  while(1)
                  {
                     if((n=read(iReadFd,buff,1024))<=0)
                        break;
                     write(iWriteFd,buff+4,n-4);
                     if(write(iFdm,buff+4,n-4)!=n-4)
                        break;
                  }
                  exit(0);
               }
               else if(pIDWt>0)
               {
                  while(1)
                  {
                     if((n=read(iFdm,buff,1024))<=0)           //就是这里退不出了
                        break;
                     if(write(iWriteFd,buff,n)!=n)
                        break;
                  }
                  kill(pIDWt,SIGTERM);
                  waitpid(pIDWt,NULL,0);
                  exit(0);
               }
          }
     }
   }
}

论坛徽章:
0
2 [报告]
发表于 2008-06-28 23:51 |只看该作者
omctrl是守护进程, 有输出么?

论坛徽章:
0
3 [报告]
发表于 2008-06-30 22:30 |只看该作者

回复 #2 isnowran 的帖子

omctrl有输出,他的子进程也有输出一些没用的信息

论坛徽章:
0
4 [报告]
发表于 2008-07-02 21:08 |只看该作者
没人答
自己顶

论坛徽章:
0
5 [报告]
发表于 2008-07-03 10:42 |只看该作者
。。。没看懂

论坛徽章:
0
6 [报告]
发表于 2008-07-03 10:49 |只看该作者

回复 #1 greenwillow280 的帖子

先把各个功能模块分成单个函数写吧,然后再考虑多进程问题
如果进程之间比较独立,而且并发运行的话,建议用多线程,可以参考
http://linux.chinaunix.net/bbs/thread-1013559-1-2.html
进程维护的例子

论坛徽章:
0
7 [报告]
发表于 2008-07-03 17:13 |只看该作者
首先谢谢你们的热心帮助

我找到原因了,但是个比较束手的问题
因为omsctrl是原有的程序,我们改不了
这个问题是因为:omsctrl运行时生成一个子进程,在子进程里忽略了一些跟终端有关的信号,然后进入后台运行,但他没有关闭stdin,stdou,stderr等文件。
我的程序里有个读终端设备的循环就退不出来了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP