![]() |
Bonjour et bienvenu par les États-Unis à la UNIX et Linux Forums! Merci de votre visite et vous joindre à notre communauté mondiale.
|
|
google unix.com
|
|||||||
| Forums | S'inscrire | Forum Rules | Liens | Albums | FAQ | Liste des membres | Calendrier | Recherche | Aujourd'hui, les postes | Marquer les forums comme lus |
| High Level Programming Posez vos questions à propos de C, C + +, Java, SQL, et d'autres langages de programmation ici. |
Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
|
||||
| Fil | Thread Starter | Forum | Réponses | Last Post |
| URGENT::: Can anybody help me dans la création de file d'attente de messages appliction? | arunchaudhary19 | High Level Programming | 9 | 11-20-2007 07:15 AM |
| processus de création de 10 | kpkant123 | De programmation et de script Shell | 2 | 05-21-2007 05:28 PM |
| créer un processus fils | Confuse | High Level Programming | 12 | 05-27-2005 11:48 AM |
| Redirection de message d'erreur ou de la tuyauterie | mariner | De programmation et de script Shell | 2 | 05-10-2005 03:04 PM |
| Comment savoir qu'un nouveau fichier est en processus de création? Il n'a pas été fermé. | linkjack | High Level Programming | 2 | 02-11-2003 01:55 PM |
![]() |
|
|
LinkBack | Thread Tools | Recherche sur ce Thread | Rate Thread | Modes d'affichage |
|
|
|
||||
|
Création de 3 et la tuyauterie d'un message
sorry im très nouveau à cela, mais je suis supposé processus de création de 3 A, B et C et ont un lien direct de A à B, B to C, et c a.
voici mon code. Il ne fonctionne pas, cependant, si vous regardez ce que j'ai en gras tant que ma dernière lecture est p [0], il semble toujours, quelle que soit la section gras. peut-on expliquer cela? 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);
}
Dernière édition par vino; au 06.17.2009 12:52 AM.. |
|
||||
|
Salut
Je ne comprends pas très bien ce code de la paix vous avez écrit:
Code:
if(pid | pid1 == 0)//process A Code:
if ( pid | (pid1 == 0) ) Le code ci-dessus est un OU l'exploitation et si la peine sera exécutée selon le résultat de droite? ---------- Post mis à jour à 05:18 PM ---------- Mise à jour précédente a été, à 05:16 PM ---------- Je ne comprends pas très bien ce morceau de code que vous a écrit: if (pid | PID1 \u003d\u003d 0) / / Un processus Cela fonctionne comme if (pid | (PID1 \u003d\u003d 0)) et je ne comprends pas très bien ce qu'il est l'idée, pourriez-vous préciser de quoi il s'agit? Le code ci-dessus est un OU l'exploitation et si la peine sera exécutée selon le résultat, non? |
|
||||
|
Citation:
|
|
||||
|
OK, d'abord, vous avez un total de quatre processus, pas trois ... (Est-ce ce que tu voulais? Pour que le processus I Un appel de trois heures pour faire naître des enfants? Ou bien vous voulez trois processus total?)
Un processus (processus original): pid \u003d B, C \u003d PID1 Processus B (premier enfant de A): pid \u003d 0, PID1 \u003d D Processus C (deuxième enfant de A): pid \u003d B, PID1 \u003d 0 Process D (enfant de B): pid \u003d 0, PID1 \u003d 0 Citation:
Processus A: (pid | PID1 \u003d\u003d 0) \u003d (B | C \u003d\u003d 0) \u003d (B | 0) \u003d true Processus B: (pid | PID1 \u003d\u003d 0) \u003d (0 | D \u003d\u003d 0) \u003d (0 | 0) \u003d false Processus C: (pid | PID1 \u003d\u003d 0) \u003d (B | 0 \u003d\u003d 0) \u003d (B | true) \u003d true Processus D: (pid | PID1 \u003d\u003d 0) \u003d (0 | 0 \u003d\u003d 0) \u003d (0 | true) \u003d true (où VRAI est une valeur non nulle ...) Citation:
Aussi, à partir de la description du problème, il sonnait comme vous avez voulu chacun des trois processus de la communication ont la capacité d'écrire des messages et recevoir des messages de chacun des deux autres processus communicants. Cela donne à penser que vous devez créer au moins trois tubes (trois invocations de pipe () dans le processus parent). Je dis "au moins trois tubes" parce que si ces processus sont en cours d'exécution en parallèle, permettant à deux processus d'écrire sur le même descripteur de fichier peut avoir des résultats imprévisibles. (À l'aide à écrire () pour écrire un seul, tout le message sera probablement sûr - mais si le message a été grand, il est possible de bloquer l'écriture d'attente pour le lecteur de lire des données - dans ce cas, je pense que c'est possible, les autres processus de l'écriture () pourrait entrer en liquidation avant la première écriture () termine son message. (pas sûr, cependant. write () est un système d'appel afin que le noyau mai synchroniser ...) Rappelez-vous que la pipe () crée deux descripteurs de fichier, mais juste une pipe. Un tube fin avec une entrée et une sortie fin. Un descripteur de fichier que vous obtenez de pipe () est soit en lecture seule ou écriture seule - vous ne pouvez pas lire et écrire de la même descripteur de fichier, lorsque le descripteur de fichier a été obtenue avec la pipe (). |
|
||||
|
Citation:
Est-ce qu'il ya de toute façon il suffit de créer 3 processus? comment à la manière d'obtenir juste variable tuyaux communiquer les uns avec les autres? Merci pour la ventilation awesome. Dernière édition par p00ndawg; au 06.30.2009 09:29 PM.. |
|
||||
|
Citation:
Pour créer un total de trois processus, assurez-vous que la fourche à deux reprises. Vous pouvez le faire en vérifiant la valeur de retour de fork () pour vous assurer que vous êtes dans le processus qui devrait fourche. 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... */
}
}
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);
}
}
|
|
||||
|
Citation:
merci encore. |
![]() |
| Bookmarks |
| Thread Tools | Recherche sur ce Thread |
| Modes d'affichage | Rate this thread |
|
|