Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

[ C - Linux ] come risveglio un processo in pause()?

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

[ C - Linux ] come risveglio un processo in pause()?

Messaggioda Shagrath » lun ott 03, 2005 7:42 pm

Ciao a tutti,

dovrei fare un programma ( x scopi didattici ) in cui devo creare sincronizzazione in lettura/scrittura su pipe tra due processi.
è possibile utilizzare le funzioni signal() e kill() per risvegliare un processo messo in pausa con la funzione pause()?

Grazie!!!
C'è sempre una soluzione...
Avatar utente
Shagrath
Senior Member
Senior Member
 
Messaggi: 261
Iscritto il: mar mar 29, 2005 8:54 pm

Messaggioda Xerex » lun ott 03, 2005 9:18 pm

Forse mi sbaglio, ma la pause è sconsigliabile usarla...penso che sia meglio usare la wait...

in più, direi che se devi usare le pipe per sincronizzare, e da come dici, il tutto è per scopi didattici, non credo che tu debba usare i segnali...

Se ti può servire ho qualche esempio
Fare la grigliata, è sempre una figata!
Avatar utente
Xerex
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5948
Iscritto il: lun ago 05, 2002 9:36 am
Località: Parma(Pr)

Messaggioda Zane » mar ott 04, 2005 8:54 am

Che sappia io l'unico modo per risvegliare un processo in pause() è con un segnale SIGALARM (oppure SIGALRM, provali entrambi).

p.s. anche tu addosso a laboratorio di sistemi operativi? [:-D]
Avatar utente
Zane
MLI Hero
MLI Hero
 
Messaggi: 7935
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara

Messaggioda Xerex » mar ott 04, 2005 10:51 am

Zane ha scritto:Che sappia io l'unico modo per risvegliare un processo in pause() è con un segnale SIGALARM (oppure SIGALRM, provali entrambi).

p.s. anche tu addosso a laboratorio di sistemi operativi? [:-D]


Io no...già fatto...da un po' anche [cry]
Fare la grigliata, è sempre una figata!
Avatar utente
Xerex
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5948
Iscritto il: lun ago 05, 2002 9:36 am
Località: Parma(Pr)

Messaggioda Shagrath » mar ott 04, 2005 9:36 pm

ehehe..si sotto con laboratorio di sitemi operativi. [8D]

dite quindi di usare la alarm?

Mah, ho fatto 1000 prove, ho provato un sacco di combinazioni..mah

Il vero problema è questo:

devo fare un programma che preveda un proc padre che legge caratteri da un file, ne invia uno per volta al figlio, che ne legge 5 per volta e, se individua una x, invia al padre un si o un no.
La comunicazione tra processi deve essere fatta tramite pipeline ( pipe() )
con utilizzo di signal(), fork(), write(), read(), close(), kill().

Non riesco a sincronizzare i due cicli..dopo una iterzione svalvolano e si bloccano, costringendomi a killarli manualmente.. [:(!]
Qui di seguito un programma di prova che ho fatto..giusto per farvi capire come ho usato le kill e le pipe..spero n sia troppo lungo..in tal caso chiedo scusa!

//-----------------------------------------------------------------------------------
#include <stdio.h>
#include <sys/file.h>
#include <sys/fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>

#define READ 0
#define WRITE 1

int main()
{
int pipefd[2];
int pipefd2[2];
char buff[10];
int pid, i, count;

// pipe da padre a figlio
if( ( pipe( pipefd ) ) == -1 )
{
perror( "pipe()" );
exit( 255 );
}

// pipe da figlio a padre
if( ( pipe( pipefd2 ) ) == -1 )
{
perror( "pipefd()#2" );
exit( 255 );
}

pid = fork();
if( pid == -1 )
{
perror( "fork()" );
exit( 255 );
}

// codice figlio
if( pid == 0 )
{
while( 1 )
{
close( pipefd[WRITE] );
close( pipefd2[READ] );

printf( "Figlio: pausa...\n" );
kill( getpid(), SIGSTOP );

// pulisco il buffer
for( i = 0; i < 10; i++ )
buff[i] = '\0';

printf( "Figlio: leggo...\n" );
if( ( read( pipefd[READ], buff, 5 ) ) == -1 )
perror( "read() figlio" );
close( pipefd[READ] );

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

printf( "Figlio: scrivo...\n" );
if( ( write( pipefd2[WRITE], "ca**o", 5 ) ) == -1 )
perror( "write() figlio" );
close( pipefd2[WRITE] );

printf( "Figlio: sveglio padre...\n" );
kill( getppid(), SIGCONT );
}
}
// codice padre
else
{
for( count = 0; count < 5; count++ )
{
close( pipefd[READ] );
close( pipefd2[WRITE] );

sleep( 1 );

printf( "Padre: inserire 5 caratteri\n" );
scanf( "%s", buff );

printf( "Padre: scrivo...\n" );
if( ( write( pipefd[WRITE], buff, 5 ) ) == -1 )
perror( "write() padre" );
close( pipefd[WRITE] );

printf( "Padre: sveglio figlio...\n" );
kill( pid, SIGCONT );

printf( "Padre: pausa...\n" );
kill( getpid(), SIGSTOP );

for( i = 0; i < 10; i++)
buff[i] = '\0';

printf( "Padre: leggo...\n" );
if( ( read( pipefd2[READ], buff, 5 ) ) == -1 )
perror( "read() padre" );

close( pipefd2[READ] );

printf( "Padre: ho letto %s\n", buff );
}

printf( "Padre: killing...\n" );
kill( pid, SIGKILL );

wait();

printf( "Padre: FINE\n" );
exit( 0 );
}
}

//-----------------------------------------------------------------------------------

cosa dovrei sistemare?! [sbigot]
C'è sempre una soluzione...
Avatar utente
Shagrath
Senior Member
Senior Member
 
Messaggi: 261
Iscritto il: mar mar 29, 2005 8:54 pm


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti

Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising