The UNIX and Linux Forums  

Go Back   UNIX e Linux Forum > Inizio Forum > Di programmazione ad alto livello
.
google unix.com



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

Reply
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Cerca in questo Thread Rate Thread Modalità di visualizzazione
  #1 (permalink)  
Old 06-16-2009
p00ndawg p00ndawg is offline
Utente Registrato
  
 

Iscriviti Data: giugno 2009
Posti: 8
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..
  #2 (permalink)  
Old 06-22-2009
lagigliaivan lagigliaivan is offline
Utente Registrato
  
 

Iscriviti Data: maggio 2008
Posti: 45
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?
  #3 (permalink)  
Old 06-28-2009
p00ndawg p00ndawg is offline
Utente Registrato
  
 

Iscriviti Data: giugno 2009
Posti: 8
Citazione:
Originalmente inviato da lagigliaivan View Post
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?
yea che ho fatto perché ho creato due forchette, ma ho voluto tanto per entrare nel switch.
  #4 (permalink)  
Old 06-30-2009
tetsujin tetsujin is offline
Utente Registrato
  
 

Iscriviti Data: aprile 2009
Interventi: 4
Citazione:
Originalmente inviato da p00ndawg View Post

Codice:
pid = fork();
pid1 = fork();
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:

Codice:
if(pid | pid1 == 0)//process A
Questa dichiarazione, se verrà effettivamente pubblicato per tre dei quattro processi: A, C, e D:
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:

Codice:
{
    close(p[0]); 
    write(p[1], message, MSGSIZE);
    read(p[1], message, MSGSIZE);
    write(p[2], message, MSGSIZE);
}
p [2] è non inizializzato. pipe () crea solo due descrittori di file: p [0], Leggere la fine del tubo, e p [1], Scrivere la fine del tubo.

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 ().
  #5 (permalink)  
Old 06-30-2009
p00ndawg p00ndawg is offline
Utente Registrato
  
 

Iscriviti Data: giugno 2009
Posti: 8
Citazione:
Originalmente inviato da tetsujin View Post
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



Questa dichiarazione, se verrà effettivamente pubblicato per tre dei quattro processi: A, C, e D:
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 ...)



p [2] è non inizializzato. pipe () crea solo due descrittori di file: p [0], Leggere la fine del tubo, e p [1], Scrivere la fine del tubo.

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 ().
sì ho voluto processi A, B, C e comunicare gli uni con gli altri, ma volevo solo tubo di un messaggio da un-> b-> c. I didnt realizzare avevo creato 4 processi.
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..
  #6 (permalink)  
Old 06-30-2009
tetsujin tetsujin is offline
Utente Registrato
  
 

Iscriviti Data: aprile 2009
Interventi: 4
Citazione:
Originalmente inviato da p00ndawg View Post
sì ho voluto processi A, B, C e comunicare gli uni con gli altri, ma volevo solo tubo di un messaggio da un-> b-> c. I didnt realizzare avevo creato 4 processi.
C'è comunque a creare solo 3 processi? come a un modo per ottenere solo i tubi variabile comunicare gli uni con gli altri?
Sicuro. Il motivo è conclusa con un totale di quattro processi perché ogni chiamata alla fork () ritorna due volte: una volta nel processo originale e una volta in quella nuova. Quindi, dopo aver effettuato la prima chiamata a fork (), vi sono due processi - che sia di andare a chiamare il secondo fork ().

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.
  #7 (permalink)  
Old 07-01-2009
p00ndawg p00ndawg is offline
Utente Registrato
  
 

Iscriviti Data: giugno 2009
Posti: 8
Citazione:
Originalmente inviato da tetsujin View Post
Sicuro. Il motivo è conclusa con un totale di quattro processi perché ogni chiamata alla fork () ritorna due volte: una volta nel processo originale e una volta in quella nuova. Quindi, dopo aver effettuato la prima chiamata a fork (), vi sono due processi - che sia di andare a chiamare il secondo fork ().

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.
oh ok thanks a lot, credo di capire ora. Ho un progetto proveniente da dove malati necessità di utilizzare alcuni tubi e questo mi riempie davvero in alcuni dei miei spazi.

grazie di nuovo.
Reply

Segnalibri

Thread Tools Cerca in questo Thread
Cerca in questo Thread:

Ricerca Avanzata
Modalità di visualizzazione Vota questo thread
Vota questo thread:

Distacco regolamento
Tu non può post nuovo thread
Tu non può inviare una risposta
Tu non può postare allegati
Tu non può modificare i tuoi post

BB codice è Su
Smilies sono Su
[IMG] codice Su
Codice HTML è Chiuso
Trackbacks sono Su
Pingbacks sono Su
Refbacks sono Su




Tutti gli orari sono GMT -4. La data di oggi è 11:20 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traduzioni Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX e Linux Forum Content Copyright © 1993-2009. Tutti i diritti Reserved.Ad di gestione da RedTyger

Contenuti pertinenti URL da vBSEO 3.2.0