Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    16

    C - come analizzare continuamente ciò che un altro processo stampa a video

    Ho bisogno di realizzare un programma c che fa questo:

    Avvia un programma esterno,
    cattura lo standard output durante l'esecuzione e a seconda di ciò che scrive deve fare delle operazioni.

    Mi spiego meglio:

    Facciamo finta di avere un programma (esempio.c) che stampa a video un elenco di numeri (da 1 a 1000).
    Io devo creare un programma che manda in esecuzione il programma e continuamente monitora cosa stampa!
    Non appena stampa il numero 345 deve killare il processo che sta stampando i numeri.

    Ho pensato di usare la funzione fork x sdoppiare il processo in modo che mentre uno manda in esecuzione esempio.c l'altro possa controllare lo standard output. Però non so come fare a controllare costantemente l'output.

    Qualcuno può aiutarmi?

    Vi ringrazio in anticipo

  2. #2
    Potresti usare le pipe; su che sistema operativo lavori?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    16
    Uso linux (debian), ma deve funzionare su tutti i sistemi Unix (qualsiasi distro linux e Mac Os)

    Non ho mai usato le pipe!

    Sapreste aiutarmi nell'intento, magari con qualke link che mi possa indirizzare verso la giusta direzione?

    In ogni caso grazie della dritta! Mi metto subito a cercare info su pipe!

  4. #4
    Se ti basta leggere dalla pipe senza avere un controllo "stretto" sul processo, puoi usare la popen; altrimenti devi usare fork, pipe ed exec. Comunque si trovano facilmente un milione di esempi su internet.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    16
    Ho più o meno fatto, solo ke adesso non riesco a capire come mai non funziona a dovere.
    Il programma che vi posto dovrebbe mettere in pausa il processo padre quando esso stampa il numero 345, ma in realtà non lo fa: se stampo tutto l'output dopo aver scritto Processo stoppato mi stampa gli altri numeri.

    Mi viene il dubbio che non analizzi l'output a runtime! E' come se prima eseguisse programma esempio e poi analizzasse l'output!
    Sapreste aiutarmi?

    Ecco il codice:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    
    int main() {
    	
    	int pdes[2];
    
    	pipe(pdes);
    
    	int r = fork();
    	
    	if (r == -1)
    	{
    		/* errore */
    		printf("Errore nella fork!\n");
    		
    	}
    	else if(r == 0)
    	{
    		/* codice del figlio */
    		close(pdes[1]);
    		char buf[20];
    		size_t nbytes;
    		ssize_t bytes_read;
    		nbytes = sizeof(buf);
    		bytes_read = read(pdes[0], buf, nbytes);
    		char stringa_da_riconoscere[]="345";
    		int j=0;
    		int l=0;
    		int ok=0;
    		int indice=1;
    		int trovato=0;
    		while(bytes_read = read(pdes[0], buf, nbytes))
    		{
    			int i;
    			for(i = 0; i < 20;i++)
    			{
    				if ((buf[i] == stringa_da_riconoscere[0]) && (trovato!=1))
    				{
    					j=1;
    					ok=1;
    				}
    				if ((ok!=1) && (trovato!=1))
    				{
    					if (buf[i] == stringa_da_riconoscere[j])
    					{
    						j++;
    						ok=1;
    					}
    					else
    					{
    						j=0;
    					}
    				}
    				if (j==(sizeof(stringa_da_riconoscere)-1))
    				{
    					//printf("ciao%d\n",l);
    					
    					/* dopo aver identificato la parola 345 nell'output, conta 10 lettere e poi sospende il processo*/
    					if (l==10)
    					{
    						int id_proc=getppid();  /* acquisisco l'id del processo padre */
    						//execlp("kill", "KILL", "-SIGSTOP "+id_proc, NULL);
    						signal(SIGTSTP, SIG_DFL);   /* reset disposition to default */
    
    						kill(id_proc, SIGTSTP);     /*sospendo il processo */
    						/*
    							codice inutile, usato solo x prova
    							printf("lifedj\n");
    							printf("%d\n",id_proc);
    							int id=getpid();
    							printf("%d\n",id);
    							kill(id_proc, SIGCONT);
    							execlp("kill", "KILL", "-SIGCONT "+id_proc, NULL);
    						*/
    					}
    					l++;
    					//j=0;
    					trovato=1;
    				}
    				//printf("%c",buf[i]);
    				ok=0;
    			}
    		}
    		if (trovato ==1)
    		{
    			l++;
    			/* dopo aver stoppato il processo padre,conta 10000-10 lettere e poi lo riavvia*/
    					
    			//if (l==10000)
    			//{
    			//	int id_proc=getppid();  /* acquisisco l'id del processo padre */
    			//	kill(id_proc, SIGCONT);     /*riavvio il processo */
    			//		
    			//}
    		}
    	}
    	else
    	{
    		/* codice del padre */
    		close(pdes[0]);
    		dup2(pdes[1], STDOUT_FILENO);
    		execlp("/home/lifedj/progetto/comando.sh", "./comando.sh", "", NULL);
    	}
    	return 0;
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.