[terminal] ecrire sur un flux

Applications multimedia / jeux
Répondre
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

[terminal] ecrire sur un flux

Message par kunsochi »

Bonjour,
J'ai trouvé un code :

Code : Tout sélectionner

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h> // needed for memset

int main(int argc,char** argv)
{
        struct termios tio;
        struct termios stdio;
        int tty_fd;
        fd_set rdset;

        unsigned char c='D';

        printf("Please start with %s /dev/ttyS1 (for example)\n",argv[0]);
        memset(&stdio,0,sizeof(stdio));
        stdio.c_iflag=0;
        stdio.c_oflag=0;
        stdio.c_cflag=0;
        stdio.c_lflag=0;
        stdio.c_cc[VMIN]=1;
        stdio.c_cc[VTIME]=0;
        tcsetattr(STDOUT_FILENO,TCSANOW,&stdio);
        tcsetattr(STDOUT_FILENO,TCSAFLUSH,&stdio);
        fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);       // make the reads non-blocking




        memset(&tio,0,sizeof(tio));
        tio.c_iflag=0;
        tio.c_oflag=0;
        tio.c_cflag=CS8|CREAD|CLOCAL;           // 8n1, see termios.h for more information
        tio.c_lflag=0;
        tio.c_cc[VMIN]=1;
        tio.c_cc[VTIME]=5;

        tty_fd=open(argv[1], O_RDWR | O_NONBLOCK);      
        cfsetospeed(&tio,B115200);            // 115200 baud
        cfsetispeed(&tio,B115200);            // 115200 baud

        tcsetattr(tty_fd,TCSANOW,&tio);
        while (c!='q')
        {
                if (read(tty_fd,&c,1)>0)        write(STDOUT_FILENO,&c,1);              // if new data is available on the serial port, print it out
                if (read(STDIN_FILENO,&c,1)>0)  write(tty_fd,&c,1);                     // if new data is available on the console, send it to the serial port
        }

        close(tty_fd);
}
Extrait : https://en.wikibooks.org/wiki/Serial_Pr ... ng/termios
pour écrire sur le flux d'un tty quelconque.
Ca marche bien, mais quand j'appuie sur la touche entrée, ca ne valide pas la commande, ca revient juste à la ligne. Idem lorsque j'appuie sur le touch backspace :o
Par exemple, dans /dev/pts/0 je lance le programme :

Code : Tout sélectionner

./a.out /dev/pts/1
Dans /dev/pts/1 j'ai bien les caractères que j'écris dans /dev/pts/0. Mais si j'écris 'l' , 's' puis j'appuie sur entrée, le curseur revient en début de ligne, et ne m'affiche pas les dossiers du répertoire.
Avatar de l’utilisateur
Piczel
Chu Ko Nu
Messages : 314
Inscription : dim. 03 mai 2015, 19:17
Localisation : Terre du Milieu

Re: [terminal] ecrire sur un flux

Message par Piczel »

Salut!

Normal que ça n'exécute rien, tu n'fais rien pour que ça s'exécute.

Dans les lignes suivantes :

Code : Tout sélectionner

while (c!='q')
        {
                if (read(tty_fd,&c,1)>0)        write(STDOUT_FILENO,&c,1);              // if new data is available on the serial port, print it out
                if (read(STDIN_FILENO,&c,1)>0)  write(tty_fd,&c,1);                     // if new data is available on the console, send it to the serial port
        }
Il faut que tu rajoutes quelquechose pour exécuter ton entrée
lili : Lenovo E540 | ArchLinux
abraham : RaspBerry Pi 3 B | ArchLinux
isaac : RaspBerry Pi 3 B | ArchLinux
Github
The best way to accelerate a computer running Windows is at 9.81m/s²
10 types de geeks, ceux qui savent compter en binaire, et les autres.
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

Re: [terminal] ecrire sur un flux

Message par kunsochi »

Mais genre quoi ? C'est pas le terminal qui se charge de ça ?
Parce qui je me met dans /dev/pts/1, et que je rentre 'l' , 's' , puis j'appuie sur entrée, il va voir que j'ai rentré '\n' donc il se dit qu'il faut qu'il exécute, non ?
Avatar de l’utilisateur
Piczel
Chu Ko Nu
Messages : 314
Inscription : dim. 03 mai 2015, 19:17
Localisation : Terre du Milieu

Re: [terminal] ecrire sur un flux

Message par Piczel »

Mh, au doute de te dire des bêtises, tu écris sur stdout, du coup ça va juste s'afficher, essaie d'écrire sur stdin peut-être ?
Là en gros, si j'ai compris, c'est qu'un simple echo sur le stdout qui se passe.
lili : Lenovo E540 | ArchLinux
abraham : RaspBerry Pi 3 B | ArchLinux
isaac : RaspBerry Pi 3 B | ArchLinux
Github
The best way to accelerate a computer running Windows is at 9.81m/s²
10 types de geeks, ceux qui savent compter en binaire, et les autres.
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

Re: [terminal] ecrire sur un flux

Message par kunsochi »

Mais quand j'ouvre le descripteur de fichier :

Code : Tout sélectionner

tty_fd=open(argv[1], O_RDWR | O_NONBLOCK);
je ne spécifie pas sur quel entré ou sortie je marque...
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17187
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [terminal] ecrire sur un flux

Message par benjarobin »

kunsochi a écrit : ven. 30 juin 2017, 12:03 Mais genre quoi ? C'est pas le terminal qui se charge de ça ?
Pas vraiment, non... C'est le travail de bash, ou zsh : le shell... Le terminal il ne fait presque rien ! Le travail du terminal est de gérer par exemple les couleurs, ce genre de chose, mais pas plus
Tu confonds TERM et SHELL !
Piczel a écrit : ven. 30 juin 2017, 13:05Là en gros, si j'ai compris, c'est qu'un simple echo ... qui se passe.
Tout à fait
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

Re: [terminal] ecrire sur un flux

Message par kunsochi »

Ok, mais alors comment dire à bash de l'éxécuter ?
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17187
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [terminal] ecrire sur un flux

Message par benjarobin »

Tu remplaces ton programme par bash, et cela marche...
Plus sérieusement si tu cherches à faire un shell, ceci est horriblement complexe. Après tu pourrais à terme purement éducatif utiliser la fonction system() en C pour exécuter la ligne courante.
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
kunsochi
Daikyu
Messages : 71
Inscription : lun. 01 sept. 2014, 21:07

Re: [terminal] ecrire sur un flux

Message par kunsochi »

Je ne cherche pas à faire un shell, mais juste à écrire sur un autre terminale et exécuter une commande.
Mais system ne vas pas , car elle va s'éxécuter sur mon terminal et pas sur l'autre...
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17187
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [terminal] ecrire sur un flux

Message par benjarobin »

Je ne pense pas que ce soit possible ce que tu cherches à faire... A creuser
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
Piczel
Chu Ko Nu
Messages : 314
Inscription : dim. 03 mai 2015, 19:17
Localisation : Terre du Milieu

Re: [terminal] ecrire sur un flux

Message par Piczel »

j'ai regardé un peu termios.h, ce que j'ai bien noté c'est ça :
https://en.wikibooks.org/wiki/Serial_Programming/termios a écrit :... Unix API for terminal I/O ...
C'est pas vraiment fait pour implémenter un tty-like (comme tu voudrais faire (?)), le but c'est gérer les entrées/sorties (Input/Output) sur un terminal. Pour créer un tty, utilise ce qui existe déjà : tty, des choses comme ça, etc

EDIT: ah j'ai enfin compris ce que tu voulais faire, écrire un truc sur plusieurs terms en même temps! my bad, oublie ce que j'ai dit
lili : Lenovo E540 | ArchLinux
abraham : RaspBerry Pi 3 B | ArchLinux
isaac : RaspBerry Pi 3 B | ArchLinux
Github
The best way to accelerate a computer running Windows is at 9.81m/s²
10 types de geeks, ceux qui savent compter en binaire, et les autres.
Avatar de l’utilisateur
RoyalPanda
yeomen
Messages : 239
Inscription : lun. 19 mai 2014, 09:08

Re: [terminal] ecrire sur un flux

Message par RoyalPanda »

Bonjour,

Si la finalité c'est de pouvoir être a plusieurs sur un terminal en même temps et voir ce que les autres font : screen
Si la finalité c'est de faire du remote shell : netcat
Si c'est une autre finalité, bah j'ai pas la réponse.
Répondre