- 论坛徽章:
- 0
|
我们系统有一个命令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);
}
}
}
}
} |
|