![]() |
|
|
google unix.com
|
|||||||
| Forums | Registrer | Forum Regler | Links | Albums | FAQ | Members List | Kalender | Søgning | Dagens Stillinger | Mark Forums Read |
| 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 |
![]() |
|
|
LinkBack | Thread Tools | Søg denne tråd | Rate Thread | Display Modes |
|
|
|
||||
|
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.. |
|
||||
|
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? |
|
||||
|
Citat:
|
|
||||
|
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:
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:
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 (). |
|
||||
|
Citat:
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.. |
|
||||
|
Citat:
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é. |
|
||||
|
Citat:
tak igen. |
![]() |
| Bogmærker |
| Thread Tools | Søg denne tråd |
| Display Modes | Bedøm denne tråd |
|
|