Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    65

    [C] concorrenza processi

    Scusate forse la domanda stupida... ho fatto un piccolo programma che crea una fork che scrive su file
    riporto solo la parte di codice che scrive su file:
    codice:
    pid_padre = fork();
    pid_figlio = getpid();
    if(pid_padre==0) {
       scanf("%s", nome);
       for(i=0; i<20;i++) {
    	fprintf(stream, "%s", "pocesso: ");
    	fprintf(stream, "%d", pid_figlio);
    	fprintf(stream, "%s", " lanciato da: ");
    	fprintf(stream, "%s\n", nome);
    	printf("pocesso: %d lanciato da %s\n", pid_figlio, nome);
    	sleep(1);
    } exit(1);
    facendo partire il programma su due terminali diversi non dovrebbero scrivere all'interno del file una riga per volta? cioè il programma finisce e all'interno del file prima ci sono le righe del primo programma lanciato e poi quelle del secondo... grazie

  2. #2
    Non necessariamente... se il file non è aperto in maniera esclusiva entrambi i processi possono scrivere nel file, e l'ordine di scrittura, se i due programmi sono in esecuzione in contemporanea, dipende da come gira allo scheduler di far eseguire un programma o l'altro (oltre che dal buffering attuato dalle funzioni di IO del C).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    65
    MItaly, innanzitutto grazie per la risposta
    la cosa che mi mette un pò di confusione è che se apro 2 shell e lancio 2 volte il programma, nel file mi trovo gli inserimenti del processo della prima shell (cioè 20 righe inserite) e solo alla fine di queste le 20 inserite dal processo lanciato dalla seconda shell (ad ogni tentativo).... mentre a vederli nel terminale proseguono contemporaneamente (ovviamente) nella printf...

  4. #4
    Con ogni probabilità dipende dal buffering... se stai scrivendo su file i dati non vengono scritti immediatamente, ma la libreria C li tiene in un buffer finché non si raggiunge una certa quantità di dati da scrivere (in modo da inviare i dati solo a grossi blocchi, per evitare di fare syscalls ad ogni momento). Probabilmente in questo caso scrivi una quantità di dati sufficientemente piccola da non riempire il buffer, per cui i dati vengono scritti tutti solo al momento della chiusura del file; il primo processo, che è partito prima, probabilmente chiude il file per primo e scrive tutti i dati, quindi fa lo stesso il secondo.

    Potresti ottenere output mischiati inserendo una fflush dopo ogni scrittura, in modo da forzare il flushing del buffer su file prima della fine del programma.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    65
    avevo immaginato potesse essere una cosa simile... grazie mille MItaly. molto gentile!!!!

    ok ok, ci provo!!!

  6. #6
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    65
    infatti dipendeva dal buffering, con fflush alla fine di ogni scrittura le righe all'interno del file sono mischiate... grazie ancora

  8. #8
    Non c'è di che, ciao!
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.