Domanda

Ho questo problema da risolvere che non ho idea di come farlo, perché ci sono solo un paio di chiamate di sistema che possiamo usare per risolverlo e non vedo come sono utili per la situazione.

L'esercizio:
Ho matrice di dimensioni [10] [1000000] con numeri interi e per ciascuna linea a creare un nuovo processo con forchetta (). L'idea di ogni processo è quello di passare attraverso tutti i numeri per quella linea specifica e trovare un numero specifico quindi stampare un messaggio su di esso. Questo è stato il primo passo del problema e il gioco è fatto. Il secondo passo è quello di stampare il totale delle occorrenze di quel numero su ogni riga per ordine . E alla fine, il totale complessivo di occorrenze di quel numero.

The Calls:
Le chiamate di sistema che posso usare sono descritti come questo nel documento per questo esercizio:

  • pid_t fork(void);
  • void exit(int status);
  • pid_t wait(int *status);
  • pid_t waitpid(pid_t pid, int *status, int options);

Il problema:
Non ho idea di come farlo perché la chiamata exit() permette solo a me di passare un numero inferiore a 256, cosa succede se il numero di occorrenze è più grande di questo numero? Come potrò restituire un tale numero?

un altro problema:
Non capisco esattamente la differenza tra wait() e waitpid() e come / dove utilizzare uno sopra l'altro. Oltre alle pagine man, ci sono più di documentazione dove posso vedere esempi di codice e tale da comprenderli meglio? O qualcuno può spiegare a me le differenze e fornire un esempio di base che dimostrano tali differenze?

È stato utile?

Soluzione

Usa waitpid() a raccogliere gli stati di uscita dei processi figli in sequenza; utilizzando wait() non fornisce alcuna garanzia circa la sequenza in cui verranno recuperati i cadaveri dei bambini.

In Unix, lo stato di uscita è limitata a 8 bit, che possono essere trattati come con o senza segno dal programma recupero dei dati. Vedrete anche un valore a 8 bit che identifica il numero del segnale e il nucleo di stato dump del figlio terminato. Per quanto ne so, né lo stato o il bit di segnale sono sempre pari a zero (e spesso entrambi - quando il processo si chiude con successo).

Se non si sa che i numeri da restituire sono più piccoli di 256, quindi stato di uscita non è la strada da percorrere. Come altri hanno detto, è necessario utilizzare un altro IPC in quel caso. Se le uniche chiamate di sistema ammesse sono quelle, poi si deve concludere che i valori saranno meno di 255, o che trabocca non contano. Nessuno dei due è soddisfacente come conclusione di fuori di un esercizio di compiti a casa, ma nel 'mondo reale', non si è limitato a soli 4 sistema di chiamate sia.

più grande di 255? . Si noti che su Windows, la gamma di codici di uscita è molto più grande -. Ma non si utilizzano le chiamate di sistema elencati nella domanda


osservazione: quando faccio exit(1), il valore di status da wait() è 256; c'è una ragione per questo?

Risposta: sì. Le basse 8 bit della parola di stato codificano il numero del segnale e così via; gli 8 bit della (16 bit) parola di stato codificano lo stato di uscita.

Vedere <sys/wait.h> e macro WIFEXITED (), WEXITSTATUS (), ecc.

Altri suggerimenti

Credo che quello che stai facendo dovrebbe funzionare bene - basta restituire il numero di occorrenze, come il codice di uscita dal processo.

Si parla che di uscita () consente solo numeri sotto 256. Ho molto dubbio se questo è il caso, ma sarebbe abbastanza semplice per voi a scrivere un programma di test per scoprire di sicuro.

Sembra che questo è in realtà solo una versione semplificata di Map-Reduce . Si potrebbe desiderare di avere uno sguardo a quel algoritmo anche per alcune idee su come si potrebbe parallelizzare ulteriormente il programma - e magari ottenere qualche credito extra:)

Per quanto riguarda la differenza tra wait () e waitpid () - se si desidera solo di aspettare per uno qualsiasi dei vostri processi figli per completare, si può usare wait (). Se si desidera attendere solo per un processo figlio specifico o se si voleva verificare solo se un processo figlio è uscito senza appendere, è necessario utilizzare waitpid ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top