Portál AbcLinuxu, 4. května 2025 12:50

Dotaz: Jak na dva terminaly, aby si navzajem posilaly data a i je vypisovaly

21.4.2005 17:00 VytliNoha | skóre: 1
Jak na dva terminaly, aby si navzajem posilaly data a i je vypisovaly
Přečteno: 287×
Odpovědět | Admin

Zdravim mohl byste mi nekdo poradit jak se da resit programek v cecku abych si pri spusteni navolil v prikazove radce jaky pseudo terminal se bude pouzivat ( ptsX ). Program se pak propoji na dalsi pseudo terminal a navzajem si posilaji data.

Presne zadani zde:

........................................

Napište program, teletype. Tento program otevře sériový port a vyšle na něj každý z klávesnice zapsaný znak a vypíše každý jednotlivý znak ze sériové linky přijatý. Pomocí sériového kabelu propojte COM1 a COM2 a spusťte 2 instance programu teletype. Který COM se bude používat specifikujte z příkazové řádky při spouštění programu.

________________

Vim jak udelat abych se propojil na terminal a cetl z nej znaky ale nevim jak udelat aby jsme mohl navzajem mezi terminali prijimat i odesilat. Snad pomoci fce select? Prosim poradte, ( nechci to naprogramovat, jen nakopnout), zatim je to pro me spanelska vesnice. Dekuji

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

wake avatar 21.4.2005 17:37 wake | skóre: 30 | blog: wake | Praha
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
Odpovědět | | Sbalit | Link | Blokovat | Admin
jeden thread v nekonecne smycce cte konsoli a posila to na pts, druhy thread v nekonecne smycce cte pts a posila to na konsoli. jeste musite vyresit interferenci konsole a vystupu (echo on/off), ale to uz necham na vas...

btw. pozdravujte sveho ucitele programovani ;-)
Tento příspěvek má hlavičku i patičku!
21.4.2005 17:49 VytliNoha | skóre: 1
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
A nebude to mezi sebou delat bordel? Vsak v konzoli budu psat text ktery to bude posilat na druhy terminal a pritom ta moje konzole bude i ten text vypisovat. Kurna leda to omezit ze vse pujde na stridacku, 1. posle prijme a muze odeslat druhy zatim ceka. To by slo osetrit semaforem nebo mutexem.

Jdu spravnym smerem?
21.4.2005 18:53 m0rph
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
he? staci normalni cekaci smycka smycka se selectem, ktera periodicky provadi (neblokujici) cteni stdinu a toho portu, pokud se na nich neco objevi, coz vam rekne ten select. jeste se musi pomoci setbuf vypnout bufferovani stdinu a stdoutu, aby se data zpracovavala a zobrazovala hned a ne az po odradkovani.

kdo chce na takovou blbinu pouzivat thready, at se vrati do windows.
21.4.2005 19:09 VytliNoha | skóre: 1
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
No pro zacatecnika velke sousto pochopit vas prispevek. Ale snad to prelouskam kazdopadne jsem rad za kazdou radu.
wake avatar 21.4.2005 19:11 wake | skóre: 30 | blog: wake | Praha
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
a proc _periodicky_ a proc _neblokujici_ ?
Tento příspěvek má hlavičku i patičku!
Josef Kufner avatar 21.4.2005 19:20 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
Oboji je zbytecne.

Kdysi jsem delal program, ktery propojil svuj stdin a stdout se sitovym soketem. Byl to jeden nekonecny cyklus se selectem. Vsechna cteni/zapisy byly blokujici a timeout selectu byl nekonecny. Program v klidu spinkal a kdyz prisla data, tak je sebral a prehodil kam patri. Pak jsem to pouzil na sitove hrani piskvorek ;)
Hello world ! Segmentation fault (core dumped)
21.4.2005 19:23 VytliNoha | skóre: 1
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
Nemohl bys mi konkretneji poradit jak na to, moc by mi to pomohlo.
Josef Kufner avatar 21.4.2005 20:29 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
Je to prakticky ucebnicove pouziti selectu. Dva vstupy - stdin a ten od druheho terminalu (treba socket) predane selectu a jinak nic.
Hello world ! Segmentation fault (core dumped)
Josef Kufner avatar 21.4.2005 20:31 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
kdybys to chtel videt nekde pouzite, tak koukni treba na wmpiki
Hello world ! Segmentation fault (core dumped)
21.4.2005 20:48 VytliNoha | skóre: 1
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
Mohl bys ten tvuj ucebnicovy priklad napsat? Moc by mi pomohlo pochopit ten select. Dekuji!!
21.4.2005 20:59 RWS
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
$ man 2 select

dej tam navic 2 FD (stdin a ten serial) a nekonecnej cyklus a mas to
EXAMPLE
       #include <stdio.h>
       #include <sys/time.h>
       #include <sys/types.h>
       #include <unistd.h>

       int
       main(void) {
           fd_set rfds;
           struct timeval tv;
           int retval;

           /* Watch stdin (fd 0) to see when it has input. */
           FD_ZERO(&rfds);
           FD_SET(0, &rfds);
           /* Wait up to five seconds. */
           tv.tv_sec = 5;
           tv.tv_usec = 0;

           retval = select(1, &rfds, NULL, NULL, &tv);
           /* Don't rely on the value of tv now! */

           if (retval == -1)
            perror("select()");
           else
           if (retval)
               printf("Data is available now.\n");
               /* FD_ISSET(0, &rfds) will be true. */
           else
               printf("No data within five seconds.\n");

           return 0;
       }
22.4.2005 08:09 VytliNoha | skóre: 1
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
Tak jsem to udelal takto, pri spusteni predavam parametr nazev terminalu na ktery ma preposilat vstup z klavesnice a z toho terminalu i cist a vypisovat to na vystup, jenomze kdyz program spustim tak vypisuje data ktere pisi na termilu ktery jsem uvedl pri spusteni ale kdyz pisu v tomto terminalu tak to zase nezbrazuje v terminalu kde jsem program spustil. V zadani mame ze mame spustit dve instance, ale to nejde protoze kdyz spustim program tak ten blokuje ten terminal z k tereho vypisuje text a uz nemuzu spusti dalsi instanci programu. Soucasni muj zdrojak, prosim poradte.
#define BUF_LEN 200
struct termios set_attributes;
          
int main(int argc, char *argv[]) {
	char *ttyID;
	char buffer[BUF_LEN];
	int result;	
    fd_set terminal, klavesnice;
    struct timeval timeout; /* Struktura s časovým limitem */
	size_t len;


	ttyID = argv[1]; /* Nacteme ttyID pseudo terminalu */
	int tty = open(ttyID, O_RDWR);
	
	// nastav nove parametry terminalu
    tcgetattr(tty, &set_attributes);
    set_attributes.c_lflag &= ~ICANON; // necekej na cely radek (noncanonical)
    //set_attributes.c_lflag &= ~ECHO;   // nezobrazuj ctene znaky
    set_attributes.c_cc[VMIN] = 1;                                        
    set_attributes.c_cc[VTIME] = 0;
    tcsetattr(tty, TCSAFLUSH, &set_attributes);
	
	while(1){
		FD_ZERO(&terminal); /* Odstranime nahodna data z mnoziny */
		FD_ZERO(&klavesnice); /* Odstranime nahodna data z mnoziny */
		FD_SET(fileno(stdin), &klavesnice); /* Naplnime mnozinu stdin */
		FD_SET(tty, &terminal); /* Naplnime mnozinu ttyckem */
		// Nadefinovany casovy interval 4 sekundy a 5 milis..
		timeout.tv_sec = 4;
		timeout.tv_usec = 50000;
		
		// Zavolám select (V Linuxu musím mít nastavenou proměnnou FD_SETSIZE) --- tezko rict co je na tom pravdy
		result = select(FD_SETSIZE, &klavesnice, &terminal, NULL, &timeout);
		switch(result){
			case -1:
				perror("select"); /* Nastala chyba */
				exit(1);
			case 0:
				printf("timeout \n"); /* Vypršel časový limit */
				break;
			default:
					  /* Obsluha soketu. Zde je možné vytvořit nové vlákno nebo proces,
						který obslouží událost na soketu. Server pak je vícevláknový.
						*/
					if (FD_ISSET(fileno(stdin), &klavesnice)) {
						/* Data available on stdin */
						char a;
						read(fileno(stdin), &a, sizeof(a));
						write(tty, &a, sizeof(a)); 
					}			
					if (FD_ISSET(tty, &terminal)) {
						char c;
						read(tty, &c, sizeof(c));/*:!*/
						if(c == '\004') { // `C-d'
							// program skonci az prijme Ctrl-D
							break;
						}
						else {
							putchar(c);
							// vyprazdni vystupni buffer
							// a zpusob tak zobrazeni znaku
							// i v nekanonickem modu terminalu
							fflush(stdout); 
						}
					}
				break;
		}
		
	}
}
wake avatar 23.4.2005 21:20 wake | skóre: 30 | blog: wake | Praha
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
snad:
.
.
.
switch(select(1, &rfds, NULL, NULL, &tv))
{
case -1:
    perror("select()");
    return -1;
    /* no break */
case 0:
    printf("No data in 5 sec.\n");
    break;
default:
    printf("DAATAAA!!!.\n");
    /* FD_ISSET(0, &rfds) will be true. */
    break;
}
return 0;
.
.
.
;-)
Tento příspěvek má hlavičku i patičku!
21.4.2005 20:00 VytliNoha | skóre: 1
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
Zatim k cemu jsem se dohrabal, program se spousti s parametrem z ktereho portu ma data tisknout na terminal

hlavicky



void *readFromTERMINAL( void *ptr )
{
        char *terminal;
        terminal = (char *) ptr;
		
		int tty = open(terminal, O_RDONLY);/*:!*/
		if(tty < 0) {
        	perror("ERROR open device /dev/ttyS1");
        	exit(EXIT_FAILURE);
    	}
		
    	while(1) {
        	char c;
       	 	read(tty, &c, sizeof(c));
        	if(c == '\004') { // `C-d'
            	// program skonci az prijme Ctrl-D
            	close(tty);
				break;
        	}
        	else {
            	putchar(c);
            	// vyprazdni vystupni buffer
            	// a zpusob tak zobrazeni znaku
            	// i v nekanonickem modu terminalu
            	fflush(stdout); 
        	}
    	}
    	close(tty);	
		
}


int main(int argc, char *argv[])
{
	pthread_t thread1, thread2;
	char *parametr;
	parametr = argv[1];   
	

    // vlakno cte z daneho portu a vypisuje na terminal
	pthread_create( &thread1, NULL, readFromTERMINAL, parametr); 
    
    
	pthread_join(thread1, NULL);
	printf("\nKonec\n");
    return EXIT_SUCCESS;
}
Josef Kufner avatar 21.4.2005 20:30 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
pouzivat na tohle vlakna je zvrhlost
Hello world ! Segmentation fault (core dumped)
21.4.2005 17:40 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nějak jsem to nepochopil, ale ty com porty si normálně otevřu jako soubory akorát že mu zadám zařízení /dev/ttySx tak podobně i s těmy terminály by to mělo jít ne ? (/dev/pts/x )
Josef Kufner avatar 21.4.2005 19:21 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
terminal uz mas otevreny pri spusteni - stdin, stdout (a stderr).
Hello world ! Segmentation fault (core dumped)
21.4.2005 20:02 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
To ano ale to je ten můj aktuální ale když to chci poslat na jiný terminál ?
Josef Kufner avatar 21.4.2005 20:21 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
screen to dela tak, ze si vytvori unixovy socket a k nemu se pak pripoji dalsi screen
Hello world ! Segmentation fault (core dumped)
wake avatar 22.4.2005 08:27 wake | skóre: 30 | blog: wake | Praha
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
presmerujes sipeckama pri volani ;)
Tento příspěvek má hlavičku i patičku!
22.4.2005 08:34 Pitrsonek
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
Mohl bys mi to ukazat nevim presne jak to myslis, v linuxu delam asi tak mesi a v cecku taky to jen proto ze musim .-) Jinak ten kod je napsany dobre, testoval si to? kdyztak moje ICQ: 114940710
wake avatar 22.4.2005 10:23 wake | skóre: 30 | blog: wake | Praha
Rozbalit Rozbalit vše Re: Jak na dva terminali aby si navzajem posilali data a aji je vypiso
moje_skvela_utilita </dev/bagr/jahoda/konzole >/dev/bagr/jahoda/konzole
Tento příspěvek má hlavičku i patičku!
21.4.2005 22:34 SAM: | skóre: 23 | blog: marsark_linux
Rozbalit Rozbalit vše Re: Jak na dva terminaly, aby si navzajem posilaly data a i je vypisov
Odpovědět | | Sbalit | Link | Blokovat | Admin
Hm, koukám to je zajímavý přístup k vypracování úlohy do školy. Jsem zvědav, jak ji budete odevzdávat svému cvičícímu :-)
21.4.2005 23:03 VytliNoha | skóre: 1
Rozbalit Rozbalit vše Re: Jak na dva terminaly, aby si navzajem posilaly data a i je vypisov
Co se ti ( vam ) nezda na tom pristupu?

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.