Istruzione wait(),linux

di il
6 risposte

Istruzione wait(),linux

Ciao ragazzi, a lezione di sistemi operativi abbiamo iniziato ad introdurre i processi...
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void)
{
    int x,pid;
    pid=fork();
    switch(pid){
        case -1:
            exit(1);
        case 0:
            return 1;
        default:
            wait(&x);
            printf("Il processo figlio (%d) ha ritornato valore: %d\n",pid,x);
    }
    return 0;
}
Ho provato a fare questo esempio di codice, credendo di aver capito... ma il processo figlio ritorna 256 invece che 1.
Sapete spiegarmi il perchè ? grazie

PS: ritorna multipli di 256, mi sfugge qualcosa....

6 Risposte

  • Re: Istruzione wait(),linux

    Nanni16 ha scritto:


    Ciao ragazzi, a lezione di sistemi operativi abbiamo iniziato ad introdurre i processi...
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
    
    int main(void)
    {
        int x,pid;
        pid=fork();
        switch(pid){
            case -1:
                exit(1);
            case 0:
                return 1;
            default:
                wait(&x);
                printf("Il processo figlio (%d) ha ritornato valore: %d\n",pid,x);
        }
        return 0;
    }
    Ho provato a fare questo esempio di codice, credendo di aver capito... ma il processo figlio ritorna 256 invece che 1.
    Sapete spiegarmi il perchè ? grazie

    PS: ritorna multipli di 256, mi sfugge qualcosa....
    Prova ad usare le macro WIFEXITED e WEXITSTATUS.

    Potresti scrivere, nel default dopo la wait(&x), qualcosa come:
    if (WIFEXITED(x)) {
        printf("Il processo figlio (%d) ha ritornato valore: %d\n",pid,WEXITSTATUS(x));
    }
    Per capire il perché ti rimando alla .
  • Re: Istruzione wait(),linux

    Grazie mille!!! Cosi funziona per valori inferiori a 255. La return è come se facesse un cast su 8 bit.... è possibile far ritornare dei valori di dimensione maggiore ??

    Ora leggo la documentazione....

    Ok ho letto la parte della wait(), e penso di aver capito... La mia domanda è questa: a cosa serva passare un puntatore a int (32bit) se poi restituisce solo 8 bit? è possibile passare delle variabili da un processo all'altro ?
  • Re: Istruzione wait(),linux

    Nanni16 ha scritto:


    Grazie mille!!! Cosi funziona per valori inferiori a 255. La return è come se facesse un cast su 8 bit.... è possibile far ritornare dei valori di dimensione maggiore ??

    Ora leggo la documentazione....
    Invece della return 1; anche nel case 0 prova a usare exit(1), ora non ricordo bene tutti i dettagli (è passato un po' di tempo dal mio esame di sistemi operativi ). Comunque nella documentazione c'è scritto tutto il necessario. Ti consiglio sempre di integrarla ai tuoi libri quando ti cimenti in questo tipo di esercizi.
  • Re: Istruzione wait(),linux

    Ho modificato il messaggio sopra, mentre mi rispondevi ehehe

    Comunque anche con la exit() fa il cast su 8 bit;
  • Re: Istruzione wait(),linux

    Nanni16 ha scritto:


    Ho modificato il messaggio sopra, mentre mi rispondevi ehehe

    Comunque anche con la exit() fa il cast su 8 bit;
    Non fa il cast, è solo che la risposta è salvata nei primi 8 bit, come scritto nella documentazione:

    WEXITSTATUS(wstatus)
    returns the exit status of the child. This consists of the
    least significant 8 bits of the status argument that the child
    specified in a call to exit(3) or _exit(2) or as the argument
    for a return statement in main(). This macro should be
    employed only if WIFEXITED returned true.
  • Re: Istruzione wait(),linux

    Nanni16 ha scritto:


    ... è possibile passare delle variabili da un processo all'altro ?
    Anche in questo caso la ti viene in aiuto. La syscall mmap fa al caso tuo.

    Puoi dichiarare ed inizializzare un intero chiamato, ad esempio, sharedInteger e che rappresenta la shared memory (memoria condivisa) tra il processo padre e quello figlio.

    Eccoti un esempio adattato al tuo codice:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <sys/mman.h> 
    
    int main(void)
    {
    	//crea la memoria condivisa
    	int * sharedInteger = mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); 
    
    	int x,pid;
    	pid=fork();
    	switch(pid){
    		case -1:
    			exit(1);
    			
    		case 0:
    			//il processo figlio gli dà un valore
    			*sharedInteger = 100;
    			return 1;
    			
    		default:
    			wait(&x);
    			if (WIFEXITED(x)) {
    				printf("Il processo figlio (%d) ha ritornato valore: %d\n",pid,WEXITSTATUS(x));
    				//il padre stampa il valore scritto dal processo figlio
    				printf("Il valore della shared memory e' %d",*shardInteger);
    			}
    			
        }
        return 0;
    }
    N.B: Se come libro di testo stai usando Sistemi operativi: concetti ed esempi Di Abraham Silberschatz, ma penso di si, c'è un paragrafo dove parla di Inter Process Communication (IPC) e quindi di meccanismi di shared memory.
Devi accedere o registrarti per scrivere nel forum
6 risposte