gpt4 book ai didi

c - 使用c语言发送向上向下箭头键以通过linux中的管道进行处理

转载 作者:太空狗 更新时间:2023-10-29 12:00:31 26 4
gpt4 key购买 nike

我使用 fork 创建了两个进程。创建了一个管道。父级将在管道的写入端写入 key ,子级 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.) 您必须调用支持带箭头的终端编辑的 shell。在通常的 Linux 上,这可能是 /bin/bash 而不是 /bin/sh

2.) bash 正在检查它的输入是否来自终端设备。取决于此,它的行为是否像 交互式 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);
}
}

关于c - 使用c语言发送向上向下箭头键以通过linux中的管道进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38736850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com