[C-Unix] Scrivere con system call write su console

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Davide18
Prode Principiante
Messaggi: 20
Iscrizione: martedì 13 gennaio 2015, 20:16

[C-Unix] Scrivere con system call write su console

Messaggio da Davide18 »

Ciao a tutti!
Sto sviluppando un semplice sistema di chat basato su architettura client/server che sfrutta socket come sistema di comunicazione.
Anche se la comunicazione tra due processi client (attraverso il server) viene effettuata con successo, non mi piace il fatto che sia l'input che l'output della chat siano visualizzati sulla stesso terminale!

Ad esempio: Chat tra client1 e client2. Se mentre il client1 sta scrivendo, il client2 invia un messaggio, la risposta verrà stampata in coda al messaggio che client1 sta scrivendo.

Codice: Seleziona tutto

 VISUALIZZAZIONE CLIENT2:
Client2: Ciao client1

Client2:...

VISUALIZZAZIONE CLIENT1:
Client1: Ciao cli...  //sta scrivendo

//arriva il messaggio di CLIENT2
Client1: Ciao cliClient2: Ciao client1

Client1:...
Quello che mi è venuto in mente per aggirare il problema è far stampare la conversazione su un' altra console, quindi ho provato a mettere in piedi questa procedura all'avvio della chat:
--> Apro una nuova console sfruttando la system call system() e redirigo su un file apposito l'output del comando "$ tty" eseguito su questa console ( passo come parametro "gnome-terminal -x sh -c \"tty > nome_file; bash\"" ), in questo modo ottengo il nome del file di tipo device a caratteri associato alla console.

--> Ottengo il descrittore di questo file passando il nome come parametro alla system call open() .

--> Scrivo con write() usando il descrittore ottenuto.

Questo è il codice C che ho scritto:

Codice: Seleziona tutto

#include <stdio.h>			//per funzioni di I/O (printf, ecc...)
#include <stdlib.h>			//per funzioni quali malloc, free, ecc.
#include <unistd.h>		//per execlp, unlink
#include <fcntl.h>		//per flag file

#define NOME_FILE "term"	//nome file
#define SIZE_NOME_FILE 4
#define PERM 0666				//permessi read/write per il file
#define SIZE_PROVA 15

void main(int argc, char *argv[]) {

	char buff[SIZE_PROVA];
	char nome_file[SIZE_NOME_FILE] = NOME_FILE;

	int fd_file_nome_terminale = open(NOME_FILE, O_CREAT | O_RDWR, PERM);
	if(fd_file_nome_terminale < 0)
		printf("ERRORE nella creazione del file %s!\n", nome_file);

	if(lseek(fd_file_nome_terminale, 0, 0) == -1) {
		printf("ERRORE nella ricollocazione del filepointer!\n");
	}

	if(system("gnome-terminal -x sh -c \"tty > term; bash\"") == -1) {
		printf("ERRORE nella system!\n");
	}

	if(lseek(fd_file_nome_terminale, 0, 0) == -1) {
		printf("ERRORE nella ricollocazione del filepointer!\n");
	}

	if(read(fd_file_nome_terminale, buff, SIZE_PROVA) == -1) {
		printf("ERRORE nella lettura di prova!\n");
	}

	if(lseek(fd_file_nome_terminale, 0, 0) == -1) {
		printf("ERRORE nella ricollocazione del filepointer!\n");
	}

	// inserisco terminatore di stringa
	int terminatore = strlen(buff);
	
	printf("strlen: %d\n", terminatore);

	buff[terminatore - 1] = '\0';

	printf("buff: %s\n", buff);


	int fd_terminale = open(buff, O_CREAT);
	if(fd_terminale < 0)
		printf("ERRORE nel tentativo di ottenere il descrittore del terminale!\n");

	printf("descr_term: %d\n", fd_terminale);
	
	if(write(fd_terminale, "prova\n", 6) == -1 ){
		printf("Errore nella scrittura di prova nel nuovo terminale!\n");
}
Purtroppo la scrittura non va mai a buon fine (la write torna con codice di errore -1). Ho provato anche a settare i permessi del file associato alla console(/dev/pits/numero_console) , ma il risultato è sempre lo stesso.
In sostanza, non riesco a fare in modo che quello che scrivo venga stampato sulla nuova console.
Secondo voi, la procedura è corretta? Oppure ne esiste una alternativa? Grazie a tutti!
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: [C-Unix] Scrivere con system call write su console

Messaggio da SuperStep »

sinceramente utilizzerei la libreria ncurses ed utilizzerei le windows per raggruppare i messaggi: (http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ http://tldp.org/HOWTO/NCURSES-Programmi ... ndows.html)
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
vbextreme
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1214
Iscrizione: domenica 12 gennaio 2014, 14:06
Desktop: lxde
Distribuzione: xubuntu 14.10

Re: [C-Unix] Scrivere con system call write su console

Messaggio da vbextreme »

Hai scelto la procedura più laboriosa, complicata e per di più inefficiente.
Hai due soluzioni, la prima consiste nel muoverti in fondo allo schermo e li prendere l'input utente e quando arrivano i messaggi scriverli in alto, per capire il concetto prova a guardare il client IRC irssi come funziona.
Per muoversi ed interagire correttamente con il terminale hai due vie:
La prima è, come già suggerito, usare la libreria ncurse.La seconda è usare i comandi vt100 per vedere come funzionano clicca su easy framework nella mia firma, apri easyconsole e li vedrai parecchie funzioni che possono tornati utili.

Se invece vuoi proseguire con i due terminali allora il secondo lo dovrai aprire tramite una chiamata exec e redirigere l'i/o usando le pipe.
Se vuoi vedere come si fa clicca sempre su easy framework apri easyprocess e guarda il codice di pro_sh() quella è esattamente la system() ma solo che da l'opportunità di re dirigere l'output.
Easy framework per il linguaggio C.
vbextreme hack your life
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: Google [Bot] e 4 ospiti