两个进程读取相同的stdin

时间:2013-07-26 11:28:36

标签: c fork stdin

在C程序中,我有一个菜单,有一些选项可供选择,用字符表示。有一个选项可以分配进程,并运行一个函数(我们可以说它在后台运行)。在某些情况下,此功能在后台运行,可以要求用户输入数据。

我的问题是:当主进程要求数据(或选项)并且子进程也要求数据时,我无法正确发送数据。

你对如何处理这个有什么想法吗?

我将添加一些代码结构(我无法发布所有内容,因为大约有600行代码):

int main(int argc, char *argv[])
{
    // Some initialization here
    while(1)
    {
        scanf("\n%c", &opt);

        switch(opt)
        {
            // Some options here
            case 'r':
                send_command(PM_RUN, fiforfd, fifowfd, pid);
                break;
            // Some more options here
        }
     }
 }

 void send_command(unsigned char command, int fiforfd, int fifowfd, int pid)
 {
     // Some operations here
     if(command == PM_RUN)
     {
         time = microtime();                
         childpid = fork();
         if(childpid == -1)
         {
             // Error here
         }   
         else if(childpid == 0)
         {
             // Here is the child
             // Some operations and conditions here
             // In some condition, appears this (expected a short in hexadecimal)
             for(i = 0; i < 7; ++i)
                 scanf("%hx\n",&data[i]));
             // More operations
             exit(0);
          }
      }
  }

1 个答案:

答案 0 :(得分:1)

它不起作用,但它可以是解决方案的开始

void    send_command(int *p)
{
  pid_t pid;

  pid = fork(); // check -1
  if (pid == 0)
    {
      int       i = 0;
      int       h;
      int       ret;
      char      buffer[128] = {0};

      dup2(p[0], 0);
      while (i < 2)
        {
          if ((ret = scanf("%s\n", buffer)))
            {
              //get your value from the buffer
              i++;
            }
        }
      printf("done\n");
      exit(1);
    }
}

在子进程中,您将从输入中读取所有内容,然后在内部找到所需的值。

int     main()
{
  char  opt;
  int   p[2];

  pipe(p);
  while(1)
    {
      scanf("\n%c", &opt);


      write(p[1], &opt, 1);
      write(p[1], "\n", 1);

      switch(opt)
        {
          // Some options here
        case 'r':
          {
            send_command(p);
            break;
          }
        default:
          break;
          // Some more options here
        }
    }
}

在当前情况下,您阅读的每个字符都将写入在p [0]上阅读的子进程。

当然,如果你有很多子进程,你必须有一个文件描述符列表并写入每个子进程(并为每个子进程调用管道)。

祝你好运

编辑:也许您应该查看namedpipe,其中父进程在其中写入所有内容并且所有子进程都在相同的中读取