又有问题~~

greenwillow280
又有问题~~

我们系统有一个命令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);
               }
          }
     }
   }
}

isnowran
omctrl是守护进程, 有输出么?

greenwillow280
回复 #2 isnowran 的帖子

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