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;
}