![]() |
|
|
google unix.com
|
|||||||
| Forum | Registrati | Regole Forum | Collegamenti | Album | FAQ | Members List | Calendario | Ricerca | Today's Posts | Mark Forums Read |
| Di programmazione ad alto livello Pubblica domande su C, C + +, Java, SQL, e di altri linguaggi di programmazione qui. |
Più di UNIX e Linux Forum Argomenti potreste trovare utili
|
||||
| Filo | Thread Starter | Forum | Risposte | Ultimo Post |
| URGENTE::: qualcuno può aiutarmi nella creazione di coda di messaggi appliction? | arunchaudhary19 | Di programmazione ad alto livello | 9 | 11-20-2007 07:15 AM |
| processo di creazione di 10 | kpkant123 | Shell scripting e di programmazione | 2 | 05-21-2007 06:28 PM |
| la creazione di processo figlio | Confondere | Di programmazione ad alto livello | 12 | 05-27-2005 12:48 PM |
| Reindirizzamento tubazioni o messaggio di errore | Mariner | Shell scripting e di programmazione | 2 | 05-10-2005 04:04 PM |
| Come sapere un nuovo file è in processo di creazione? Non è stato chiuso. | linkjack | Di programmazione ad alto livello | 2 | 02-11-2003 01:55 PM |
![]() |
|
|
LinkBack | Thread Tools | Cerca in questo Thread | Rate Thread | Modalità di visualizzazione |
|
|
|
||||
|
3 Creazione di processo e di tubazioni di un messaggio
im dispiace molto per questo nuovo, ma io sono supposti per creare processi di 3 A, B e C e hanno un legame diretto da uno a b, b per c, e c a. qui è il mio codice. Essa, tuttavia, se si guarda a ciò che ho in grassetto, come lungo come il mio ultimo letto è p [0] sembra funzionare sempre, indipendentemente dalla sezione in grassetto. si può spiegare questo? Codice:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#define MSGSIZE 14
char *message = "hello, world!";
main() {
char inbuf[MSGSIZE];
int p[3];
pid_t pid;
pid_t pid1;
if (pipe(p) == -1){
perror("pipe call");
exit(1);
}
pid = fork();
pid1 = fork();
if(pid == -1){
perror("Fork failed");
exit(1);
}
if(pid | pid1 == 0)//process A
{
close(p[0]);
write(p[1], message, MSGSIZE);
read(p[1], message, MSGSIZE);
write(p[2], message, MSGSIZE);
}
/*else if(pid1 == 0){
close(p[1]);
//read(p[1], message, MSGSIZE);
write(p[2], message, MSGSIZE);
}*/
else{
//parent process C
close(p[2]);
read(p[0], inbuf, MSGSIZE);
printf("Pipelined message return:%s\n", inbuf);
wait(NULL);
}
exit(0);
}
Ultimo a cura di vino; al 06/17/2009 01:52 AM.. |
|
||||
|
Salve
Non capisco molto bene questa pace di codice che hai scritto: Codice:
if(pid | pid1 == 0)//process A Questo funziona come Codice:
if ( pid | (pid1 == 0) ) e non capisco molto bene ciò che è l'idea, che potrebbe chiarire? Il codice di cui sopra è uno O se il funzionamento e la frase sarà effettuata secondo il suo risultato giusto? Posta ---------- aggiornato alle 05:18 PM ---------- precedente aggiornamento è stato a 05:16 PM ---------- Non capisco molto bene questo pezzo di codice che ha scritto: if (pid | PID1 \u003d\u003d 0) / / processo A Questo funziona come if (pid | (PID1 \u003d\u003d 0)) e non capisco molto bene che questa è l'idea, che potrebbe chiarire? Il codice di cui sopra è uno O se il funzionamento e la frase sarà effettuata secondo il suo risultato, giusto? |
|
||||
|
Citazione:
|
|
||||
|
OK, prima fuori, hai un totale di quattro processi di qui, e non tre ... (E 'questo che volevi? Per il processo Chiedo a generare un largo tre figli? Oppure non si desidera tre processi totale?)
Un processo (processo originale): pid \u003d B, C \u003d PID1 Processo B (primo figlio di A): pid \u003d 0, PID1 \u003d D Processo C (secondo figlio di A): pid \u003d B, PID1 \u003d 0 Processo di D (figlio di B): pid \u003d 0, PID1 \u003d 0 Citazione:
Processo A: (pid | PID1 \u003d\u003d 0) \u003d (B | C \u003d\u003d 0) \u003d (B | 0) \u003d true Processo B: (pid | PID1 \u003d\u003d 0) \u003d (0 | D \u003d\u003d 0) \u003d (0 | 0) \u003d false Processo C: (pid | PID1 \u003d\u003d 0) \u003d (B | 0 \u003d\u003d 0) \u003d (B | true) \u003d true Processo D: (pid | PID1 \u003d\u003d 0) \u003d (0 | 0 \u003d\u003d 0) \u003d (0 | true) \u003d true (dove VERO nonzero valore è di circa ...) Citazione:
Inoltre, dalla descrizione del problema che suonava come avete voluto ciascuno dei tre processi di comunicazione hanno la capacità di scrivere e ricevere messaggi da ciascuno degli altri due processi di comunicare. Ciò suggerisce che devi creare almeno tre tubi (tre invocazioni di tubo () nel processo padre). Dico "almeno tre tubi", perché se questi processi sono in esecuzione contemporaneamente, due processi che consentono di scrivere lo stesso file Descrittore potrebbero avere risultati imprevedibili. (Uso di scrivere () per scrivere una sola, tutto il messaggio sarà probabilmente sicuro -, ma se il messaggio è stato grande, è possibile scrivere la blocca in attesa per il lettore a leggere alcuni dati fuori - nel qual caso credo che sia possibile, il processo di scrittura di altri () potrebbe ottenere vento fino a prima della prima write () termina il suo messaggio. (Non sono sicuro, però. write () è una chiamata di sistema in modo che il kernel potrebbe sincronizzati ...) Ricorda che il tubo () crea due descrittori di file, ma un solo tubo. Un tubo con un input e un output fine fine. Un descrittore di file che ricevete dal tubo () sia di sola lettura o la scrittura solo - non si può mai leggere e scrivere dallo stesso descrittore di file, quando il descrittore di file è stato ottenuto con il tubo (). |
|
||||
|
Citazione:
C'è comunque a creare solo 3 processi? come a un modo per ottenere solo i tubi variabile comunicare gli uni con gli altri? Grazie per la ripartizione awesome. Ultimo a cura di p00ndawg; al 06/30/2009 10:29 PM.. |
|
||||
|
Citazione:
Per creare un totale di tre processi, assicurarsi di forcella solo due volte. È possibile effettuare questa operazione controllando il valore di ritorno di fork () per assicurarsi che siete nel processo che dovrebbe forcella. Codice:
pid_b = fork();
if (pid_b == 0)
{
/* fork() returned 0, so this is the new process, which I call process B. */
pid_c = fork();
if (pid_c == 0)
{
/* This is process C... */
}
}
Ora, se il tuo solo canali di comunicazione devono essere tali che A può inviare messaggi a B, e B possono inviare messaggi in C, è il vento con qualcosa come questo: Codice:
pipe(channel_ab);
pid_b = fork();
if (pid_b > 0)
{
/* Process A... Send messages to B using channel_ab[1] */
close(channel_ab[0]);
write(channel_ab[1], msg, size);
} else if (pid_b == 0) {
/* Process B */
close(channel_ab[1]);
pipe(channel_bc);
pid_c = fork();
if (pid_c > 0)
{
/* Still process B. Receive messages from A using channel_ab[0], send messages to C using channel_bc[1]. */
close(channel_bc[0]);
msg_size = read(channel_ab[0], buffer, size);
write(channel_bc[1], msg, size);
} else if (pid_c == 0) {
/* Process C. Receive messages from B using channel_bc[0]. */
msg_size = read(channel_bc[0], buffer, size);
}
}
'Naturalmente c'è il controllo degli errori e varie cose che ci si vuole fare in là che non è mostrato in precedenza -, ma che l'idea di base. |
|
||||
|
Citazione:
grazie di nuovo. |
![]() |
| Segnalibri |
| Thread Tools | Cerca in questo Thread |
| Modalità di visualizzazione | Vota questo thread |
|
|