2010-09-15 18 views
0

Je crée une application C sous Unix qui utilise une entrée tty brute.Fonction Unix write() (libc)

Je fais appel write() aux caractères sur l'écran, mais je veux manipuler le curseur:

ssize_t 
write(int d, const void *buf, size_t nbytes); 

J'ai remarqué que, si buf a la valeur 8 (je veux dire omble chevalier tmp = 8, puis en passant & tmp), il déplace le curseur/pointeur vers l'arrière sur l'écran.

Je me demandais où je pourrais trouver tous les codes, par exemple, je souhaite avancer le curseur mais je n'arrive pas à le trouver via Google.

Y at-il une page qui répertorie tout le code pour la fonction write() s'il vous plaît?

Merci beaucoup,

Jary

Répondre

2

8 est juste le code ascii pour le retour arrière. Vous pouvez taper man ascii et regarder toutes les valeurs (la page de manuel sur ma boîte Ubuntu a des noms plus conviviaux pour les valeurs). Si vous voulez faire des choses plus compliquées, vous pouvez regarder une bibliothèque comme ncurses.

+0

Merci beaucoup! Cela a aidé. – Jary

1

Si vous utilisez write juste pour que vous avez le contrôle du curseur bas niveau, je pense que vous utilisez le mauvais outil pour le travail. Il existe des codes de commande pour de nombreux types de terminaux. Les codes VT100, par exemple, sont des séquences de la forme "\x1b[...", mais plutôt que d'envoyer des codes bruts, vous feriez mieux d'utiliser une bibliothèque comme ncurses.

2

Vous venez de découvrir que le code de caractère 8 est retour arrière (contrôle-H).

Il est probablement préférable d'utiliser la bibliothèque de curses pour gérer l'écran. Cependant, vous pouvez trouver les séquences de contrôle connues à l'aide de infocmp pour décompiler l'entrée terminfo de votre terminal. Le format n'est pas particulièrement facile à comprendre, mais il est relativement complet. L'alternative est de trouver un manuel pour le terminal, qui a tendance à être plutôt difficile. Par exemple, j'utilise une fenêtre couleur Xterm; infocmp dit:

# Reconstructed via infocmp from file: /usr/share/terminfo/78/xterm-color 
xterm-color|nxterm|generic color xterm, 
    am, km, mir, msgr, xenl, 
    colors#8, cols#80, it#8, lines#24, [email protected], pairs#64, 
    acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, 
    bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=^M, 
    csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H, 
    cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C, 
    cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, 
    dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, 
    el=\E[K, enacs=\E)0, home=\E[H, ht=^I, hts=\EH, il=\E[%p1%dL, 
    il1=\E[L, ind=^J, 
    is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, kbs=^H, 
    kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, 
    kdch1=\E[3~, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, 
    kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, 
    kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, 
    kf2=\E[12~, kf20=\E[34~, kf3=\E[13~, kf4=\E[14~, 
    kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, 
    kfnd=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~, 
    kslt=\E[4~, meml=\El, memu=\Em, op=\E[m, rc=\E8, rev=\E[7m, 
    ri=\EM, rmacs=^O, rmcup=\E[2J\E[?47l\E8, rmir=\E[4l, 
    rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, 
    rs2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, sc=\E7, 
    setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[m, smacs=^N, 
    smcup=\E7\E[?47h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, 
    smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n, 
    u8=\E[?1;2c, u9=\E[c, 

qui contient des informations sur les caractères de dessin de la boîte, les séquences de code générées par les touches de fonction, différentes séquences de déplacement du curseur, et ainsi de suite.

Vous pouvez en savoir plus sur X/Open Curses (v4.2) en HTML. Cependant, cela est officiellement obsolète, remplacé par X/Open Curses v7, que vous pouvez télécharger gratuitement en PDF.

+0

Merci beaucoup. C'est une solution très utile, je vais essayer cela. Merci! – Jary

+0

À titre d'explication supplémentaire, dans la sortie infocmp ci-dessus, il y a une liste d'assocations clé = valeur, comme home = \ E [H. Celui-ci signifie que vous pouvez déplacer le curseur "home" - en haut à gauche de l'écran - en imprimant d'abord un caractère ASCII 27 (appelé ESCAPE ou ESC - vous le verrez dans 'man ascii'), puis à gauche crochet (ASCII 91 décimal), puis la lettre H (ASCII 72). Fondamentalement, pour chaque type de logiciel/dispositif de terminal capable de déplacer le curseur à la maison, infocmp rapportera les caractères à utiliser, afin que le logiciel puisse rechercher "home" dans la liste et travailler sur tous les terminaux. –

+0

Il est bon de jouer avec ces séquences juste un peu ...Par exemple, sur de nombreux terminaux, ESCAPE [31m à ESCAPE [37m changera la couleur de premier plan du texte que vous imprimez par la suite, puis ESCAPE [30m le réinitialisera par défaut. Ceci est utile pour définir l'invite du shell sur quelque chose qui se démarque visuellement de votre sortie de frappe et de commande - une situation où la bibliothèque ncurses complète ne serait pas très utile (vous l'utilisez lors de l'écriture de vos propres applications). Vous pouvez google "shell invites" pour plus d'exemples de ce genre de chose. –