当前位置:  技术问答>linux和unix

父子进程交互输出问题。

    来源: 互联网  发布时间:2016-05-20

    本文导语:  程序利用从键盘获取一个字符,并打印1111,若按下tab键则创建子进程,循环获取并输出2222,按下tab键重新切回父进程。现在父--->子-->父--->子都可以正常切,但是为什么再从子就切不回来了呢?卡死在wait_chid()里了,不...

程序利用从键盘获取一个字符,并打印1111,若按下tab键则创建子进程,循环获取并输出2222,按下tab键重新切回父进程。现在父--->子-->父--->子都可以正常切,但是为什么再从子就切不回来了呢?卡死在wait_chid()里了,不知道怎么回事。请大家指点。代码如下:
#include  
#include  
#include  


void tell_wait();
void wait_child(void);
void wait_parent(void);
void tell_child(pid_t pid);
void tell_parent(pid_t pid);
void sig_usr(int signo);

static volatile sig_atomic_t sigflag;
static sigset_t newmask, oldmask, zeromask;


main() 

    int ch,i=1,j =0 ,k=2;  
    int start=0;
    int mm = 0;
    int exit=0;
    WINDOW *wins[2];
    pid_t pid;

    tell_wait();
    while (ch = getchar())  
    {         
        exit = 0;
        switch(ch)
        {
            case 'q':
                  exit = 1;
                  break;  
            case 9:
               if (0 == start)    //第一次切换
                 {
                 if ((pid = fork()) == 0)    //子进程
                       {
                          while(ch = getchar())
                            {
                               exit = 0;
                               switch(ch)
                                 {
                                    case 9:
                                        exit = 1;
        break;
            default:
                                        break;
                   }
               if (1 == exit) 
                                 {
                                    tell_parent(getppid());
                                    wait_parent();
     }
                            }
                       }
                     else if(pid >0)            //父进程
                       {
                          wait_child();
                          start = 1;
                       }
                 }
               else
                 {
                    tell_child(pid);
                    wait_child();
                 }
                 break;
            default:
                 break;
        }
        if (1 == exit) break;
     } 
}

void sig_usr(int signo)
{
    if(signo == SIGCONT) 
     {
        sigflag = 1;
     } 
    else
      printf("received unexpected signal(%d)n", signo);

    return;
}

void tell_wait()
{
   if (signal(SIGCONT, sig_usr) == SIG_ERR)
      printf("signal(SIGINT) error");
   sigemptyset(&zeromask);
   sigemptyset(&newmask);
   sigaddset(&newmask, SIGCONT);
   if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • fork() 父子进程执行顺序问题
  • 父子进程读写文件问题
  • 父子进程共享数据的问题
  • 使用信号量如何让父子进程交替运行?
  • 父子进程问题,高手请进!!!
  • 请教,进程通讯问题,除了父子进程能进行通讯外,任意两个进程都可以吗?
  • 父子进程共享文件描述符问题
  • 父子进程通信:内存共享的问题
  • 父子进程间的数据传输!online!
  • 关于父子共用一个socket的问题?求教。。
  • 请教一个父子进程控制的问题
  • 在linux,如何用共享内存来实现进程间的通讯?(这些进程没有父子关系)
  • 如何理解父子进程修改共享量的运行结果
  • 高手请进,如何完备的获得进程间父子关系,谢谢!
  • 父子进程通信
  • 关于fork后父子进程的关系
  • 父子进程问题
  • apue中父子进程同步的问题。
  • 关于父子进程执行顺序的问题
  • jquery的父子兄弟节点查找示例代码


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3