![]() |
|
|
google unix.com
|
|||||||
| Forum | Registrera | Forum Regler | Länkar | Album | FAQ | Medlemslista | Kalender | Söka | Dagens inlägg | Markera forum som lästa |
| 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 |
![]() |
|
|
LinkBack | Thread Tools | Sök i denna tråd | Rate Thread | Visningslägen |
|
|
|
||||
|
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.. |
|
||||
|
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? |
|
||||
|
Citat:
|
|
||||
|
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:
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:
Ä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 (). |
|
||||
|
Citat:
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.. |
|
||||
|
Citat:
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. |
|
||||
|
Citat:
tack igen. |