如何从控制台读取2个任务而不丢失任何输入字符?

时间:2016-08-12 11:09:10

标签: posix stdin

在我与Nuttx,POSIX投诉RTOS的环境中,2个任务(进程)正在运行&两者都从控制台接收输入。当在控制台中输入“天气”时,根据优先级和其他因素,每个任务都会接收输入字符的子集。

如何在两个任务中获得“天气”而不考虑优先级等。?目前,每个任务等待选择,然后读取stdin。

每个进程是否有stdin流/缓冲区?

1 个答案:

答案 0 :(得分:1)

当然在一个角色" w"由一个任务接收,因为它已经被消耗并且在传入的数据流中不再可用,所以它不能被另一个任务接收。

你需要的是在两个任务中发球的道德等同物。这个T恤任务将:

  1. 移动控制台输入描述符(0)
  2. 
        int input;
        dup2(0, input);
        close(0);
    
    
    1. 创建两个管道。生成任务1,以便它继承stdin上的pipe1,如:
    2. 
          int task1_fd[2];
          pipe(task1_fd);
          dup2(task1_fd[0], 0);
          if (task1_fd[0] != 0)
            close(task1_fd[0])
          task_create(...)
      
      
      1. 生成任务2,以便它在stdin上继承pipe2,如:
      2. 
            int task2_fd[2];
            ... similar ...
        
        
        1. 从控制台阅读,
        2. 
              nread = read(input, buf, buflen);
          
          
          1. 并写入两个管道:
          2. 
                nwritten = write(task1_fd1[1], buf, nread);
                ...
                nwritten = write(task1_fd2[1], buf, nread);
            
            

            通过这种方式,从控制台读取的每个字符都可以回显到这两个任务。

            上面的代码示例使用NuttX工具来完成这项工作。重定向可以在像Linux这样可以支持fork()的完整POSIX系统上更加干净地完成。

            我们这样做:保存标准输入文件描述符,重定向I / O和生成。

            在完整的POSIX系统中,您可以执行:fork,redirect I / O和exec。

            Nuttx实际上支持fork(well,vfork)和exec函数。但这些很少用于深度嵌入式系统。