The UNIX and Linux Forums  

Go Back   UNIX og Linux Forums > Top Forums > Højtstående Programmering
.
google unix.com



Højtstående Programmering Post spørgsmål om C, C + +, Java, SQL, og andre programmerings sprog her.

Mere UNIX og Linux Forum Emner du måske kan finde Helpful
Tråd Thread Starter Forum Svar Last Post
HASTER::: Kan nogen hjælpe mig med at skabe besked kø appliction?? arunchaudhary19 Højtstående Programmering 9 11-20-2007 07:15 AM
skabe 10 proces kpkant123 Shell Programmering og Scripting 2 05-21-2007 06:28 PM
skabe barn proces Forvirre Højtstående Programmering 12 05-27-2005 12:48 PM
Omdirigering eller rørsystem fejlmeddelelse MARINER Shell Programmering og Scripting 2 05-10-2005 04:04 PM
Sådan kender en ny fil er i færd med at skabe? Det har ikke været lukket. linkjack Højtstående Programmering 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 Søg denne tråd Rate Thread Display Modes
  #1 (permalink)  
Old 06-16-2009
p00ndawg p00ndawg is offline
Registreret Bruger
  
 

Join Date: Jun 2009
Stillinger: 8
Oprettelse 3 og rør en besked

sorry im meget nyt til denne, men jeg er meningen at skabe 3 processer A, B og C og har en direkte forbindelse fra A til B, B til C og C til a.

her er min kode. Det virker, men hvis man ser på, hvad jeg fed skrift, så længe mit sidste læs er p [0] ser det ud til altid at arbejde, uanset hvilken fed skrift afsnit.

kan man forklare dette?


Code:
#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);
}


Sidst redigeret af vino; 06-17-2009 på 01:52 AM..
  #2 (permalink)  
Old 06-22-2009
lagigliaivan lagigliaivan is offline
Registreret Bruger
  
 

Join Date: May 2008
Stillinger: 45
Hej

Jeg ikke forstår udmærket denne fred i kode, du skrev:


Code:
if(pid | pid1 == 0)//process A

Det fungerer som
Code:
 if ( pid | (pid1 == 0) )

og jeg forstår ikke rigtig godt, hvad der er den ide, der kunne præcisere det?


Ovenstående kode er en eller drift og hvis punktum vil blive udført efter dens resultat ret?

---------- Post ajourføres 05:18 ---------- Forrige opdatering blev på 05:16 ----------

Jeg ikke forstår udmærket dette stykke kode, du skrev:


if (pid | pid1 \u003d\u003d 0) / / proces A

Det fungerer som

if (pid | (pid1 \u003d\u003d 0))

og jeg forstår ikke, virkelig godt det det er den idé, kan du præcisere det?

Ovenstående kode er en eller drift og hvis punktum vil blive udført efter dens resultat, right?
  #3 (permalink)  
Old 06-28-2009
p00ndawg p00ndawg is offline
Registreret Bruger
  
 

Join Date: Jun 2009
Stillinger: 8
Citat:
Oprindeligt Indsendt af lagigliaivan View Post
Jeg ikke forstår udmærket denne fred i kode, du skrev:


Code:
if(pid | pid1 == 0)//process A

Det fungerer som
Code:
 if ( pid | (pid1 == 0) )

og jeg forstår ikke rigtig godt, hvad der er den ide, der kunne præcisere det?


Ovenstående kode er en eller drift og hvis punktum vil blive udført efter dens resultat ret?

---------- Post ajourføres 05:18 ---------- Forrige opdatering blev på 05:16 ----------

Jeg ikke forstår udmærket dette stykke kode, du skrev:


if (pid | pid1 \u003d\u003d 0) / / proces A

Det fungerer som

if (pid | (pid1 \u003d\u003d 0))

og jeg forstår ikke, virkelig godt det det er den idé, kan du præcisere det?

Ovenstående kode er en eller drift og hvis punktum vil blive udført efter dens resultat, right?
ja det gjorde jeg, fordi jeg oprettet to gafler, men jeg ønskede begge at indtaste skifte erklæring.
  #4 (permalink)  
Old 06-30-2009
tetsujin tetsujin is offline
Registreret Bruger
  
 

Join Date: Apr 2009
Stillinger: 4
Citat:
Oprindeligt Indsendt af p00ndawg View Post

Code:
pid = fork();
pid1 = fork();
OK, først ud, så du har alt fire processer her, ikke tre ... (Er det det, du ønskede? For den proces, jeg kalder en for at gyde off tre børn? Eller har du ønsker tre processer alt?)

Process A (original proces): pid \u003d B, pid1 \u003d C
Proces B (første barn af A): pid \u003d 0, pid1 \u003d D
Proces C (andet barn af A): pid \u003d B, pid1 \u003d 0
Proces D (barn af B): pid \u003d 0, pid1 \u003d 0

Citat:

Code:
if(pid | pid1 == 0)//process A
Dette hvis erklæring faktisk vil køre i tre af de fire processer: A, C og D:
Metode A: (pid | pid1 \u003d\u003d 0) \u003d (B | C \u003d\u003d 0) \u003d (B | 0) \u003d true
Proces B: (pid | pid1 \u003d\u003d 0) \u003d (0 | D \u003d\u003d 0) \u003d (0 | 0) \u003d false
Metode C: (pid | pid1 \u003d\u003d 0) \u003d (B | 0 \u003d\u003d 0) \u003d (B | true) \u003d true
Proces D: (pid | pid1 \u003d\u003d 0) \u003d (0 | 0 \u003d\u003d 0) \u003d (0 | true) \u003d true
(hvor sandt er nogle nonzero værdi ...)

Citat:

Code:
{
    close(p[0]); 
    write(p[1], message, MSGSIZE);
    read(p[1], message, MSGSIZE);
    write(p[2], message, MSGSIZE);
}
p [2] er uninitialized. pipe () kun skaber to fil deskriptorer: p [0], Læste ende af røret, og p [1], Skrivebeskyttelsestappen ende af røret.

Også fra problemet beskrivelse det lød som du ville hver af de tre kommunikere processer for at have mulighed for at skrive beskeder til og modtage beskeder fra hver af de to andre kommunikere processer. Dette antyder, skal du oprette mindst tre rør (tre invocations af rør () i moderselskabet processen). Jeg siger "mindst tre rør", for hvis disse processer kører samtidigt, så to processer til at skrive til den samme fil deskriptor kunne have uforudsigelige resultater. (Med skriver () til at skrive et enkelt, hele beskeden vil formentlig være sikkert - men hvis budskabet var store er det muligt at skrive ville blokere venter for læseren at læse nogle data ud - og i så fald tror jeg, at det er muligt, den anden proces's skrive () kunne opløse ind før den første skrive () er færdig med sit budskab. (Ikke sikker på, selv om. skrive () er et system opkald så kernen mai synkronisere det ...)

Husk, at røret () opretter to fil deskriptorer men bare en pipe. Et rør med et input ende og et output ende. En fil deskriptor får du fra pipe () er enten skrivebeskyttet eller skrive-only - man aldrig kan læse og skrive fra den samme fil deskriptor, når filen deskriptor blev opnået med pipe ().
  #5 (permalink)  
Old 06-30-2009
p00ndawg p00ndawg is offline
Registreret Bruger
  
 

Join Date: Jun 2009
Stillinger: 8
Citat:
Oprindeligt Indsendt af tetsujin View Post
OK, først ud, så du har alt fire processer her, ikke tre ... (Er det det, du ønskede? For den proces, jeg kalder en for at gyde off tre børn? Eller har du ønsker tre processer alt?)

Process A (original proces): pid \u003d B, pid1 \u003d C
Proces B (første barn af A): pid \u003d 0, pid1 \u003d D
Proces C (andet barn af A): pid \u003d B, pid1 \u003d 0
Proces D (barn af B): pid \u003d 0, pid1 \u003d 0



Dette hvis erklæring faktisk vil køre i tre af de fire processer: A, C og D:
Metode A: (pid | pid1 \u003d\u003d 0) \u003d (B | C \u003d\u003d 0) \u003d (B | 0) \u003d true
Proces B: (pid | pid1 \u003d\u003d 0) \u003d (0 | D \u003d\u003d 0) \u003d (0 | 0) \u003d false
Metode C: (pid | pid1 \u003d\u003d 0) \u003d (B | 0 \u003d\u003d 0) \u003d (B | true) \u003d true
Proces D: (pid | pid1 \u003d\u003d 0) \u003d (0 | 0 \u003d\u003d 0) \u003d (0 | true) \u003d true
(hvor sandt er nogle nonzero værdi ...)



p [2] er uninitialized. pipe () kun skaber to fil deskriptorer: p [0], Læste ende af røret, og p [1], Skrivebeskyttelsestappen ende af røret.

Også fra problemet beskrivelse det lød som du ville hver af de tre kommunikere processer for at have mulighed for at skrive beskeder til og modtage beskeder fra hver af de to andre kommunikere processer. Dette antyder, skal du oprette mindst tre rør (tre invocations af rør () i moderselskabet processen). Jeg siger "mindst tre rør", for hvis disse processer kører samtidigt, så to processer til at skrive til den samme fil deskriptor kunne have uforudsigelige resultater. (Med skriver () til at skrive et enkelt, hele beskeden vil formentlig være sikkert - men hvis budskabet var store er det muligt at skrive ville blokere venter for læseren at læse nogle data ud - og i så fald tror jeg, at det er muligt, den anden proces's skrive () kunne opløse ind før den første skrive () er færdig med sit budskab. (Ikke sikker på, selv om. skrive () er et system opkald så kernen mai synkronisere det ...)

Husk, at røret () opretter to fil deskriptorer men bare en pipe. Et rør med et input ende og et output ende. En fil deskriptor får du fra pipe () er enten skrivebeskyttet eller skrive-only - man aldrig kan læse og skrive fra den samme fil deskriptor, når filen deskriptor blev opnået med pipe ().
ja jeg ville egentlig bare processer A, B og C at kommunikere med hinanden, men jeg vil blot pipe en besked fra a-> b-> c. Jeg gjorde ikke indse jeg havde skabt 4 processer.
Er der alligevel kun oprette 3 processer? hvordan ser en måde at lige få variable rør kommunikere med hinanden?

Thanks for the awesome opdeling.

Sidst redigeret af p00ndawg; 06-30-2009 på 10:29 PM..
  #6 (permalink)  
Old 06-30-2009
tetsujin tetsujin is offline
Registreret Bruger
  
 

Join Date: Apr 2009
Stillinger: 4
Citat:
Oprindeligt Indsendt af p00ndawg View Post
ja jeg ville egentlig bare processer A, B og C at kommunikere med hinanden, men jeg vil blot pipe en besked fra a-> b-> c. Jeg gjorde ikke indse jeg havde skabt 4 processer.
Er der alligevel kun oprette 3 processer? hvordan ser en måde at lige få variable rør kommunikere med hinanden?
Sikker. Grunden du afsluttes med i alt fire processer er fordi hvert opkald til bord () returnerer to gange: én gang i den oprindelige proces og en gang i den nye. Så når du har foretaget den første indkaldelse til bord (), er der to processer - som begge går på at kalde det andet fork ().

At skabe en alt tre processer, at du kun gaffelgreb to gange. Du kan gøre dette ved at kontrollere den returnerede værdi af fork () til at sikre, at du i den proces, der bør gaffel.


Code:
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... */
    }
}

Nu, hvis din kommunikationskanaler kun behøver at være sådan, at A kan sende beskeder til B, og B kan sende beskeder til C, du vind op med noget som dette:


Code:
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);
    }
}

»Selvfølgelig er der forskellige Fejlkontrol og ting du gerne vil gøre derinde, som ikke er vist ovenfor - men det er den grundlæggende idé.
  #7 (permalink)  
Old 07-01-2009
p00ndawg p00ndawg is offline
Registreret Bruger
  
 

Join Date: Jun 2009
Stillinger: 8
Citat:
Oprindeligt Indsendt af tetsujin View Post
Sikker. Grunden du afsluttes med i alt fire processer er fordi hvert opkald til bord () returnerer to gange: én gang i den oprindelige proces og en gang i den nye. Så når du har foretaget den første indkaldelse til bord (), er der to processer - som begge går på at kalde det andet fork ().

At skabe en alt tre processer, at du kun gaffelgreb to gange. Du kan gøre dette ved at kontrollere den returnerede værdi af fork () til at sikre, at du i den proces, der bør gaffel.


Code:
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... */
    }
}

Nu, hvis din kommunikationskanaler kun behøver at være sådan, at A kan sende beskeder til B, og B kan sende beskeder til C, du vind op med noget som dette:


Code:
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);
    }
}

»Selvfølgelig er der forskellige Fejlkontrol og ting du gerne vil gøre derinde, som ikke er vist ovenfor - men det er den grundlæggende idé.
oh ok takket et parti, jeg tror jeg forstår nu. Jeg har et projekt, der kommer op, hvor syg er nødt til at bruge nogle rør, og jeg det virkelig udfylder nogle af mine blanktegn.

tak igen.
Reply

Bogmærker

Thread Tools Søg denne tråd
Søg denne tråd:

Avanceret søgning
Display Modes Bedøm denne tråd
Bedøm denne tråd:

Udstationering Regler
Du kan ikke post nye tråde
Du kan ikke post svar
Du kan ikke post vedhæftede filer
Du kan ikke redigere dine indlæg

BB-kode er
Smilies er
[IMG] koden er
HTML-koden er Slukket
Trackbacks er
Pingbacks er
Refbacks er




Alle tidspunkter er GMT -4. Den tid er nu 07:49 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Oversættelser Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX og Linux Forums Content Copyright © 1993-2009. Alle rettigheder Reserved.Ad Management ved RedTyger

Content Relevant webadresser ved vBSEO 3.2.0