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