The UNIX and Linux Forums  


Go Back   UNIX och Linux Forum > Upp Forum > High Level Programming
.
google unix.com



High Level Programming Post frågor om C, C + +, Java, SQL och andra programmeringsspråk här.

Mer UNIX och Linux Forum Ämnen Du kan hitta Helpful
Tråd Thread Starter Forum Svar Senaste Inlägg
BRÅDSKANDE::: Kan någon hjälpa mig att skapa budskap kö appliction? arunchaudhary19 High Level Programming 9 11-20-2007 07:15
skapa 10 process kpkant123 Shell-programmering och Skript 2 05-21-2007 06:28
skapa barn process Förvirra High Level Programming 12 05-27-2005 12:48
Omläggning eller rörsystem felmeddelande Mariner Shell-programmering och Skript 2 05-10-2005 04:04
Hur vet en ny fil i processen för att skapa? Det har inte varit stängd. linkjack High Level Programming 2 02-11-2003 01:55

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ök i denna tråd Rate Thread Visningslägen
  #1 (permalänk)  
Old 06-16-2009
p00ndawg p00ndawg is offline
Registered User
  
 

Join Date: juni 2009
Inlägg: 8
Skapa 3 och rörsystem ett meddelande

sorry im mycket nytt för detta men jag är tänkt att skapa 3 processer A, B och C och har en direkt länk från A till B, B till C och C till A.

här är min kod. Det fungerar, men om man tittar på vad jag fetstil så länge som min sista läsa är p [0] tycks det alltid, oberoende av fetstil avsnitt.

Kan någon förklara detta?


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


Senast redigerad av vino; 06-17-2009 vid 01:52..
  #2 (permalänk)  
Old 06-22-2009
lagigliaivan lagigliaivan is offline
Registered User
  
 

Join Date: maj 2008
Inlägg: 45
Hej

Jag förstår inte mycket väl denna fred i koden som du skrev:


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

Detta fungerar som
Kod:
 if ( pid | (pid1 == 0) )

och jag förstår inte riktigt bra vad som är tanken, kan klargöra det?


Koden ovan är en eller operation och om meningen kommer att utföras enligt resultatet rätt?

---------- Post uppdateras 05:18 ---------- Föregående uppdatering var vid 05:16 ----------

Jag förstår inte mycket väl denna del av koden som du skrev:


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

Detta fungerar som

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

och jag förstår inte riktigt bra det här är tanken, kan du förtydliga det?

Koden ovan är en eller operation och om meningen kommer att utföras enligt dess resultat, eller hur?
  #3 (permalänk)  
Old 06-28-2009
p00ndawg p00ndawg is offline
Registered User
  
 

Join Date: juni 2009
Inlägg: 8
Citat:
Ursprungligen postat av lagigliaivan View Post
Jag förstår inte mycket väl denna fred i koden som du skrev:


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

Detta fungerar som
Kod:
 if ( pid | (pid1 == 0) )

och jag förstår inte riktigt bra vad som är tanken, kan klargöra det?


Koden ovan är en eller operation och om meningen kommer att utföras enligt resultatet rätt?

---------- Post uppdateras 05:18 ---------- Föregående uppdatering var vid 05:16 ----------

Jag förstår inte mycket väl denna del av koden som du skrev:


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

Detta fungerar som

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

och jag förstår inte riktigt bra det här är tanken, kan du förtydliga det?

Koden ovan är en eller operation och om meningen kommer att utföras enligt dess resultat, eller hur?
ja jag gjorde det för att jag skapat två gafflar, men jag ville både in omkopplaren uttalande.
  #4 (permalänk)  
Old 06-30-2009
tetsujin tetsujin is offline
Registered User
  
 

Join Date: april 2009
Inlägg: 4
Citat:
Ursprungligen postat av p00ndawg View Post

Kod:
pid = fork();
pid1 = fork();
OK, första start, du har ett totalt fyra processer, inte tre ... (Är det vad du ville? För att jag kallar A för att leka bort tre barn? Eller har du tre processer totalt?)

Process A (ursprungliga processen): pid \u003d B, pid1 \u003d C
Process B (första barnet av A): pid \u003d 0, pid1 \u003d D
Process C (andra barnet av A): pid \u003d B, pid1 \u003d 0
Process D (barn B): pid \u003d 0, pid1 \u003d 0

Citat:

Kod:
if(pid | pid1 == 0)//process A
Detta om meddelandet verkligen kommer att löpa under tre av de fyra processer: A, C och D:
Process A: (pid | pid1 \u003d\u003d 0) \u003d (B | C \u003d\u003d 0) \u003d (B | 0) \u003d sant
Process B: (pid | pid1 \u003d\u003d 0) \u003d (0 | D \u003d\u003d 0) \u003d (0 | 0) \u003d false
Process C: (pid | pid1 \u003d\u003d 0) \u003d (B | 0 \u003d\u003d 0) \u003d (B | true) \u003d sant
Process D: (pid | pid1 \u003d\u003d 0) \u003d (0 | 0 \u003d\u003d 0) \u003d (0 | true) \u003d sant
(där sant är några nonzero värde ...)

Citat:

Kod:
{
    close(p[0]); 
    write(p[1], message, MSGSIZE);
    read(p[1], message, MSGSIZE);
    write(p[2], message, MSGSIZE);
}
p [2] är avinitieras. pipe () bara skapa två fil deskriptorer: p [0]Har läst slutet av röret, och p [1]De skriver slutet av röret.

Även från problemet beskrivning det lät som om du ville ha var och en av de tre kommunicerande processer för att få möjlighet att skriva meddelanden till och ta emot meddelanden från de andra två kommunicerande processer. Detta tyder på att du måste skapa minst tre ledningar (tre invocations i pipe () i moderbolaget process). Jag säger "minst tre pipor" för om dessa processer körs samtidigt, vilket gör att två processer för att skriva till samma fil deskriptor kunde ha oförutsägbara resultat. (Använda skriva () för att skriva ett enda, hela meddelandet kommer förmodligen att vara säker - men om meddelandet var stor är det möjligt att skriva skulle blockera väntar för läsaren att läsa vissa uppgifter ut - i så fall tror jag det är möjligt att andra processen är att skriva () skulle kunna avveckla få in innan den första att skriva () avslutar brevet. (Ej säker dock. skriva () är ett system samtal så kärnan maj synkronisera det ...)

Kom ihåg att röret () skapar två fil deskriptorer men bara ett pip. Ett rör med en ingång slut och en uteffekt slut. En fil deskriptor du får från röret () antingen är skrivskyddad eller skriva-bara - du kan aldrig läsa och skriva från samma fil deskriptor, när filen deskriptor erhölls med pipe ().
  #5 (permalänk)  
Old 06-30-2009
p00ndawg p00ndawg is offline
Registered User
  
 

Join Date: juni 2009
Inlägg: 8
Citat:
Ursprungligen postat av tetsujin View Post
OK, första start, du har ett totalt fyra processer, inte tre ... (Är det vad du ville? För att jag kallar A för att leka bort tre barn? Eller har du tre processer totalt?)

Process A (ursprungliga processen): pid \u003d B, pid1 \u003d C
Process B (första barnet av A): pid \u003d 0, pid1 \u003d D
Process C (andra barnet av A): pid \u003d B, pid1 \u003d 0
Process D (barn B): pid \u003d 0, pid1 \u003d 0



Detta om meddelandet verkligen kommer att löpa under tre av de fyra processer: A, C och D:
Process A: (pid | pid1 \u003d\u003d 0) \u003d (B | C \u003d\u003d 0) \u003d (B | 0) \u003d sant
Process B: (pid | pid1 \u003d\u003d 0) \u003d (0 | D \u003d\u003d 0) \u003d (0 | 0) \u003d false
Process C: (pid | pid1 \u003d\u003d 0) \u003d (B | 0 \u003d\u003d 0) \u003d (B | true) \u003d sant
Process D: (pid | pid1 \u003d\u003d 0) \u003d (0 | 0 \u003d\u003d 0) \u003d (0 | true) \u003d sant
(där sant är några nonzero värde ...)



p [2] är avinitieras. pipe () bara skapa två fil deskriptorer: p [0]Har läst slutet av röret, och p [1]De skriver slutet av röret.

Även från problemet beskrivning det lät som om du ville ha var och en av de tre kommunicerande processer för att få möjlighet att skriva meddelanden till och ta emot meddelanden från de andra två kommunicerande processer. Detta tyder på att du måste skapa minst tre ledningar (tre invocations i pipe () i moderbolaget process). Jag säger "minst tre pipor" för om dessa processer körs samtidigt, vilket gör att två processer för att skriva till samma fil deskriptor kunde ha oförutsägbara resultat. (Använda skriva () för att skriva ett enda, hela meddelandet kommer förmodligen att vara säker - men om meddelandet var stor är det möjligt att skriva skulle blockera väntar för läsaren att läsa vissa uppgifter ut - i så fall tror jag det är möjligt att andra processen är att skriva () skulle kunna avveckla få in innan den första att skriva () avslutar brevet. (Ej säker dock. skriva () är ett system samtal så kärnan maj synkronisera det ...)

Kom ihåg att röret () skapar två fil deskriptorer men bara ett pip. Ett rör med en ingång slut och en uteffekt slut. En fil deskriptor du får från röret () antingen är skrivskyddad eller skriva-bara - du kan aldrig läsa och skriva från samma fil deskriptor, när filen deskriptor erhölls med pipe ().
ja jag egentligen ville processer A, B och C kommunicera med varandra, men jag ville bara röret ett meddelande från a-> b-> c. I didnt inser jag hade skapat 4 processer.
Finns det något sätt att bara skapa 3 processer? Vad sägs om ett sätt att bara få rörliga ledningar kommunicerar med varandra?

Tack för bra uppdelning.

Senast redigerad av p00ndawg; 06-30-2009 vid 10:29..
  #6 (permalänk)  
Old 06-30-2009
tetsujin tetsujin is offline
Registered User
  
 

Join Date: april 2009
Inlägg: 4
Citat:
Ursprungligen postat av p00ndawg View Post
ja jag egentligen ville processer A, B och C kommunicera med varandra, men jag ville bara röret ett meddelande från a-> b-> c. I didnt inser jag hade skapat 4 processer.
Finns det något sätt att bara skapa 3 processer? Vad sägs om ett sätt att bara få rörliga ledningar kommunicerar med varandra?
Säker. Anledningen du avvecklas med totalt fyra processer är att varje samtal till bord () återvänder två gånger: en gång i den ursprungliga processen och en gång på den nya. Så när du gör det första samtalet till bord () finns det två processer - som båda går på för att ringa upp andra bord ().

För att skapa ett totalt tre processer, se till att du endast bord två gånger. Du kan göra detta genom att kontrollera returvärdet av bord () för att se till att du är i processen som bör gaffelgrepp.


Kod:
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, om din kommunikationskanaler behöver bara vara så att en kan skicka meddelanden till B, och B kan skicka meddelanden till C, du avsluta med något liknande detta:


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

"Självklart finns olika felkontroll och saker du vill göra i det som inte visas ovan - men det är den grundläggande tanken.
  #7 (permalänk)  
Old 07-01-2009
p00ndawg p00ndawg is offline
Registered User
  
 

Join Date: juni 2009
Inlägg: 8
Citat:
Ursprungligen postat av tetsujin View Post
Säker. Anledningen du avvecklas med totalt fyra processer är att varje samtal till bord () återvänder två gånger: en gång i den ursprungliga processen och en gång på den nya. Så när du gör det första samtalet till bord () finns det två processer - som båda går på för att ringa upp andra bord ().

För att skapa ett totalt tre processer, se till att du endast bord två gånger. Du kan göra detta genom att kontrollera returvärdet av bord () för att se till att du är i processen som bör gaffelgrepp.


Kod:
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, om din kommunikationskanaler behöver bara vara så att en kan skicka meddelanden till B, och B kan skicka meddelanden till C, du avsluta med något liknande detta:


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

"Självklart finns olika felkontroll och saker du vill göra i det som inte visas ovan - men det är den grundläggande tanken.
oh ok tack så mycket, jag tror jag förstår nu. Jag har ett projekt som kommer upp där sjuka behöver använda några rör och jag det verkligen fyller i vissa av mina ämnen.

tack igen.
Reply

Komihåglista

Thread Tools Sök i denna tråd
Sök i denna tråd:

Avancerad sökning
Visningslägen Betygsätt denna tråd
Betygsätt denna tråd:

Utstationering Regler
Du får inte efter nya trådar
Du får inte efter svar
Du får inte skicka bilagor
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG] kod
HTML-koden är Av
Trackback är
Pingbacks är
Refbacks är




Alla tider är GMT -4. Klockan är nu 07:33.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Översättningar Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX och Linux Forum Innehållet upphovsrättsskyddat © 1993-2009. All Rights Reserved.Ad förvaltning RedTyger

Content Relevant webbadresser från vBSEO 3.2.0