Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linuxc中的按键破环_C_Keypress - Fatal编程技术网

linuxc中的按键破环

linuxc中的按键破环,c,keypress,C,Keypress,我需要用C语言编写一个程序,这样做: 例如,当我按下“a”时,终端将在无休止循环中写入键入的字符,如下所示:aaaaaaaaaaaaaaaa…直到按下另一个键,例如“b”。最终输出应该是这样的:aaaaaabbbbq(q应该终止程序)。 我的代码在这里: int main(int argc, char** argv) { int c; static struct termios staryTermios, novyTermios; tcgetattr(STDIN_F

我需要用C语言编写一个程序,这样做: 例如,当我按下“a”时,终端将在无休止循环中写入键入的字符,如下所示:aaaaaaaaaaaaaaaa…直到按下另一个键,例如“b”。最终输出应该是这样的:aaaaaabbbbq(q应该终止程序)。 我的代码在这里:

int main(int argc, char** argv) {

    int c;
    static struct termios staryTermios, novyTermios;


    tcgetattr(STDIN_FILENO, &staryTermios);

    novyTermios = staryTermios;
    novyTermios.c_lflag &= ~(ICANON);
    tcsetattr(STDIN_FILENO, TCSANOW, &novyTermios);
    while ((c = getchar()) != 'q') {
        putchar(c);
    }

    tcsetattr( STDIN_FILENO, TCSANOW, &staryTermios);

    return 0;
}

这个版本只写一次键入的字符,然后等待另一次按键,我想您需要两个线程,这两个线程都将访问一个公共变量。一个线程的任务是连续打印公共变量。第二种方法的工作是等待键盘输入,并相应地更新变量。

要获得所需的结果,需要使标准输入无阻塞。您可以通过对代码进行这种轻微的修改来实现这一点。它在MacOSX10.7.5上运行良好。请注意,
getchar()
在没有准备好读取的字符时返回EOF(大多数情况下都是这样;您和我的打字速度都不足以影响现代计算机)。我有点担心,在某些系统上,一旦
getchar()
在没有字符可读取时返回了一次EOF,它可能再也不会返回除EOF以外的任何内容,但这对于Mac OS X来说不是问题

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>

static void err_exit(const char *msg);

int main(void)
{
    int c;
    int oc = '\0';
    struct termios staryTermios, novyTermios;
    int oflags, nflags;

    if (tcgetattr(STDIN_FILENO, &staryTermios) != 0)
        err_exit("tcgetattr() failed");

    novyTermios = staryTermios;
    novyTermios.c_lflag &= ~(ICANON);
    if (tcsetattr(STDIN_FILENO, TCSANOW, &novyTermios) != 0)
        err_exit("tcsetattr() failed to set standard input");

    oflags = fcntl(STDIN_FILENO, F_GETFL);
    if (oflags < 0)
        err_exit("fcntl() F_GETFL failed");

    nflags = oflags;
    nflags |= O_NONBLOCK;
    if (fcntl(STDIN_FILENO, F_SETFL, nflags) == -1)
        err_exit("fcntl() F_SETFL failed");

    while ((c = getchar()) != 'q')
    {
        if (c != EOF)
            oc = c;
        if (oc != '\0')
            putchar(oc);
    }

    if (tcsetattr(STDIN_FILENO, TCSANOW, &staryTermios) != 0)
        err_exit("tcsetattr() failed to reset standard input");

    putchar('\n');
    return 0;
}

static void err_exit(const char *msg)
{
    fprintf(stderr, "%s\n", msg);
    exit(1);
}
#包括
#包括
#包括
#包括
#包括
静态无效错误退出(const char*msg);
内部主(空)
{
INTC;
int oc='\0';
结构termios staryTermios、novyTermios;
标签的内码,nflags;
如果(tcgetattr(标准文件号和staryTermios)!=0)
err_exit(“tcgetattr()失败”);
novyTermios=staryTermios;
novyTermios.c_lflag&=~(ICANON);
if(tcsetattr(标准文件号、TCSANOW和novyTermios)!=0)
err_exit(“tcsettr()未能设置标准输入”);
oflags=fcntl(标准文件号,F\U GETFL);
如果(标签数<0)
错误退出(“fcntl()F_GETFL失败”);
nflags=标签数量;
nflags |=O|U非块;
如果(fcntl(标准文件号、F\U SETFL、nflags)=-1)
错误退出(“fcntl()F_SETFL失败”);
而((c=getchar())!='q')
{
如果(c!=EOF)
oc=c;
如果(oc!='\0')
putchar(oc);
}
if(tcsetattr(标准文件号、TCSANOW和staryTermios)!=0)
err_exit(“tcsettr()未能重置标准输入”);
putchar('\n');
返回0;
}
静态无效错误退出(const char*msg)
{
fprintf(stderr,“%s\n”,msg);
出口(1);
}

谢谢,但我是C编程新手,不知道如何使用线程。我的朋友建议我用read()函数代替od getchar()。但是我不知道如何使read()函数或类似的函数超时