The UNIX and Linux Forums  
Bonjour et bienvenu par les États-Unis à la UNIX et Linux Forums! Merci de votre visite et vous joindre à notre communauté mondiale.

Go Back   Les systèmes UNIX et Linux Forums > Top Forums > High Level Programming
.
google unix.com



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

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 Recherche sur ce Thread Rate Thread Modes d'affichage
  #1 (permalink)  
Old 06-16-2009
p00ndawg p00ndawg is offline
Registered User
  
 

Date d'inscription: juin 2009
Messages: 8
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..
  #2 (permalink)  
Old 06-22-2009
lagigliaivan lagigliaivan is offline
Registered User
  
 

Join Date: Mai 2008
Posts: 45
Salut

Je ne comprends pas très bien ce code de la paix vous avez écrit:

Code:
if(pid | pid1 == 0)//process A
Cela fonctionne comme
Code:
 if ( pid | (pid1 == 0) )
et je ne comprends pas très bien quelle est l'idée, il pourrait préciser?


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?
  #3 (permalink)  
Old 06-28-2009
p00ndawg p00ndawg is offline
Registered User
  
 

Date d'inscription: juin 2009
Messages: 8
Citation:
Posté par lagigliaivan View Post
Je ne comprends pas très bien ce code de la paix vous avez écrit:

Code:
if(pid | pid1 == 0)//process A
Cela fonctionne comme
Code:
 if ( pid | (pid1 == 0) )
et je ne comprends pas très bien quelle est l'idée, il pourrait préciser?


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?
oui je l'ai fait parce que j'ai créé deux fourchettes, mais je voulais à la fois à entrer dans le switch.
  #4 (permalink)  
Old 06-30-2009
Tetsujin tetsujin is offline
Registered User
  
 

Date d'inscription: avril 2009
Messages: 4
Citation:
Posté par p00ndawg View Post
Code:
pid = fork();
pid1 = fork();
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:
Code:
if(pid | pid1 == 0)//process A
Cette déclaration, si effectivement une durée de trois des quatre processus: A, C et D:
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:
Code:
{
    close(p[0]); 
    write(p[1], message, MSGSIZE);
    read(p[1], message, MSGSIZE);
    write(p[2], message, MSGSIZE);
}
p [2] est non initialisée. pipe () seulement crée deux fichiers: p [0], Lire la fin de la pipe, et p [1], Écrire la fin de la pipe.

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 ().
  #5 (permalink)  
Old 06-30-2009
p00ndawg p00ndawg is offline
Registered User
  
 

Date d'inscription: juin 2009
Messages: 8
Citation:
Posté par Tetsujin View Post
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



Cette déclaration, si effectivement une durée de trois des quatre processus: A, C et D:
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 ...)



p [2] est non initialisée. pipe () seulement crée deux fichiers: p [0], Lire la fin de la pipe, et p [1], Écrire la fin de la pipe.

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 ().
oui je voulais les processus A, B, C et de communiquer les uns avec les autres, mais je voulais seulement un message de pipe a-> b-> c. I didnt que j'avais créé 4 processus.
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..
  #6 (permalink)  
Old 06-30-2009
Tetsujin tetsujin is offline
Registered User
  
 

Date d'inscription: avril 2009
Messages: 4
Citation:
Posté par p00ndawg View Post
oui je voulais les processus A, B, C et de communiquer les uns avec les autres, mais je voulais seulement un message de pipe a-> b-> c. I didnt que j'avais créé 4 processus.
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?
Certain. La raison pour laquelle vous retrouvés avec un total de quatre processus est dû au fait que chaque appel à la fourchette () retourne deux fois: une fois dans le processus original et une fois dans la nouvelle. Ainsi, après avoir fait le premier appel à la fourchette (), il existe deux processus - qui va à l'appel de la deuxième fourchette ().

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... */
    }
}
Maintenant, si vos canaux de communication ne doivent être tels que A peut envoyer des messages à B et B peuvent envoyer des messages à C, vous vous retrouver avec quelque chose comme ceci:

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);
    }
}
Cours il ya une vérification d'erreur et de diverses choses que vous voulez faire là-dedans ce n'est pas indiqué ci-dessus -, mais c'est l'idée de base.
  #7 (permalink)  
Old 07-01-2009
p00ndawg p00ndawg is offline
Registered User
  
 

Date d'inscription: juin 2009
Messages: 8
Citation:
Posté par Tetsujin View Post
Certain. La raison pour laquelle vous retrouvés avec un total de quatre processus est dû au fait que chaque appel à la fourchette () retourne deux fois: une fois dans le processus original et une fois dans la nouvelle. Ainsi, après avoir fait le premier appel à la fourchette (), il existe deux processus - qui va à l'appel de la deuxième fourchette ().

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... */
    }
}
Maintenant, si vos canaux de communication ne doivent être tels que A peut envoyer des messages à B et B peuvent envoyer des messages à C, vous vous retrouver avec quelque chose comme ceci:

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);
    }
}
Cours il ya une vérification d'erreur et de diverses choses que vous voulez faire là-dedans ce n'est pas indiqué ci-dessus -, mais c'est l'idée de base.
oh ok merci beaucoup, je crois que je comprends maintenant. J'ai un projet à venir, où de mauvais besoin d'utiliser des tuyaux et je comble ce vraiment dans certains de mes flans.

merci encore.
Reply

Bookmarks

Thread Tools Recherche sur ce Thread
Recherche sur ce Thread:

Recherche avancée
Modes d'affichage Rate this thread
Rate this thread:

Règles de messages
Tu mai pas de nouvelles discussions: nonoui
Tu mai pas envoyer des réponses:
Tu mai pas envoyer des pièces jointes
Tu mai pas modifier vos messages

BB code est Sur
Smilies sont Sur
[IMG] code est Sur
Le code HTML est Hors tension
Trackbacks sont Sur
Pingbacks sont Sur
Refbacks sont Sur




Toutes les heures sont au format GMT -4. Le temps est maintenant 05:55 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traductions Langue Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Les systèmes UNIX et Linux Forums Content Copyright © 1993-2009. Tous droits Reserved.Ad de gestion par RedTyger

Content Relevant URLs par vBSEO 3.2.0