Chinaunix首页 | 论坛 | 博客
  • 博客访问: 172940
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 451
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-28 09:10
文章分类
文章存档

2016年(43)

我的朋友

分类: 嵌入式

2016-08-23 10:27:53


点击(此处)折叠或打开

  1. static unsigned long s_pm = -1; /* 重定向伪终端master端fd */
  2.     static unsigned long s_ps = -1; /* 重定向伪终端slave端fd */
  3.     static unsigned char s_ptyname[MAX_PTY_NAME] = {0}; /* 伪终端设备文件名 */
  4.     static unsigned long g_hbxlReadFd = -1;
  5.     static unsigned long g_hbxWriteFd = -1;
  6.     
  7.     /* 创建用于作为内部shell 标准IO的伪终端 */
  8.     if (-1 == openpty(&s_pm,&s_ps,s_ptyname,NULL,NULL))
  9.     {
  10.         
  11.         return 0;
  12.     }
  13.     else
  14.     {
  15.         /* 清除伪终端默认的回显属性,否则写入终端的数据又会被重复读到 */
  16.         tcgetattr(s_ps,&term);
  17.         term.c_lflag = term.c_lflag & (~(ICANON));
  18.         term.c_lflag = term.c_lflag & (~(ISIG));
  19.         term.c_cc[VMIN] = 1;
  20.         term.c_cc[VTIME] = 0;
  21.         term.c_lflag = term.c_lflag & (~(ECHO | ECHOE | ECHOK | ECHONL));
  22.         tcsetattr(s_ps,TCSAFLUSH,&term);
  23.     }
  24.     
  25.     fflush(stdin);
  26.     fsync(STDIN_FILENO);
  27.     /* 将标准输入定位到s_ps,亦即将s_ps代表的文件句柄复制到标准输出的fd1位置上, dup2之后,原本标准输入都输入到s_ps*/
  28.     if (-1 == dup2(s_ps,STDIN_FILENO))
  29.     {
  30.  
  31.         close(s_pm);
  32.         close(s_ps);
  33.         return 0;
  34.     }

  35.     fflush(stdout);
  36.     fsync(STDOUT_FILENO);
  37.     /* 将标准输出定位到s_ps,亦即将s_ps代表的文件句柄复制到标准输出的fd1位置上, dup2之后,原本标准输出(比如printf打印)都输出到s_ps*/
  38.     if (-1 == dup2(s_ps,STDOUT_FILENO))
  39.     {

  40.         close(s_pm);
  41.         close(s_ps);
  42.         return 0;
  43.     }

  44.     fflush(stderr);
  45.     fsync(STDERR_FILENO);
  46.     /* 将标准错误定位到s_ps,亦即将s_ps代表的文件句柄复制到标准错误的fd2位置上 */
  47.     if (-1 == dup2(s_ps,STDERR_FILENO))
  48.     {

  49.         close(s_pm);
  50.         close(s_ps);
  51.         return 0;
  52.     }
  53.     
  54.     
  55.     
  56.     /*后续可以这么用*/
  57.     
  58. void badddd()
  59. {    
  60.      if (-1 == (g_hbxlReadFd = dup(STDIN_FILENO)))
  61.     {
  62.         
  63.         return;
  64.     }

  65.    
  66.     if(-1 == (g_hbxWriteFd = dup(STDOUT_FILENO)))
  67.     {
  68.         return;
  69.     }
  70.     while (1)
  71.     {
  72.         if (num < COMMAND_BUF_LENGTH -1)
  73.         {
  74.             /* 若缓冲未满,从用户的输入读取一个字符 */
  75.             val = read(g_hbxReadFd, &cval, 1);
  76.             if (0 > val && EINTR != errnoGet())
  77.             {
  78.                 
  79.                 break;
  80.             }
  81.             else if (0 == val)
  82.             {
  83.                 continue;
  84.             }
  85.     
  86.     
  87.     }        
  88.     
  89. }

阅读(1500) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~