我使用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);
}
}
请帮助我,
答案 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);
}
}
此外,您还应测试pipe
和fork
的返回值。就个人而言,我会写它:
#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);
}
}