使用c语言向下发送向下箭头键来处理linux中的管道

时间:2016-08-03 07:15:59

标签: c linux bash

我使用fork创建了两个进程。创建了一个管道。 Parent将在管道的写入结束处写入密钥,并且通过管道的读取结束将复制子stdin(0)。了解它的工作非常好并且对字母表有好处。 但我也想发送上下箭头键,请帮帮我。

int main()
{
   int fd[2];
   char enter = 10;
   char *exit = "exit";
   char up = 193;//what i have to use here
   char down = 194;//what i have to use here
   pipe(p);
   if(fork())
   {
    write(p[1],&up,1);              //not working
    write(p[1],&down,1);            //not working
    write(p[1],exit,strlen(exit));  //working 
    write(p[1],&enter,1);           //working
    wait(NULL);
   }
   else
   {
    close(0);
    dup(p[0]);
    execl("/bin/sh","sh",NULL);
   }
}

请帮助我,

1 个答案:

答案 0 :(得分:3)

有几点:

1。)您必须使用箭头调用支持终端编辑的shell。在通常的Linux上,这可能是/bin/bash而不是/bin/sh

2。)bash正在检查它的输入是否来自终端设备。根据这一点,它的行为类似于interactive shell。您似乎想在交互模式下使用它。然而,管道不是终端设备。要使其进入交互模式,您可以在其调用时使用bash选项“-i”。

3。)正如评论所指出的,在通常的Linux X终端上,向上和向下箭头的代码是多字符串,如“\ 033 [A”和“\ 033 [B”。这取决于您使用的设备和环境,可能您的值对于您的系统是正确的。

以下代码适用于通常的Linux环境:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{
   int p[2];
   char enter = 10;
   char *exit = "exit";
   char *up = "\033[A";
   char *down = "\033[B";
   pipe(p);
   if(fork())
   {
    write(p[1],up,3);
    write(p[1],down,3);
    write(p[1],exit,strlen(exit));
    write(p[1],&enter,1);
    wait(NULL);
   }
   else
   {
    close(0);
    dup(p[0]);
    execl("/bin/bash","bash","-i",NULL);
   }
}

此外,您还应测试pipefork的返回值。就个人而言,我会写它:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{
   int p[2];
   int r;
   char command[] = "\033[A\033[Bexit\n";

   r = pipe(p);
   if (r < 0) {
       perror("Can't create pipe");
       return(-1);
   }
   r = fork();
   if (r < 0) {
       perror("Can't fork");
       return(-1);
   } else if (r > 0) {
       close(p[0]);
       write(p[1], command, sizeof(command)-1);
       close(p[1]);
       wait(NULL);
   } else {
       close(p[1]);
       dup2(p[0], 0);
       close(p[0]);
       execl("/bin/bash","bash","-i",NULL);
   }
}