118 votes

Comment envoyer une simple chaîne de caractères entre deux programmes à l'aide de tuyaux?

J'ai essayé de chercher sur le net, mais il ya peu de ressources. Un petit exemple suffit.

MODIFIER Je veux dire, deux différents programmes en C communiquer les uns avec les autres. Un programme devrait envoyer "Salut", et l'autre doit le recevoir. Quelque chose comme ça.

162voto

jschmier Points 8088

Un régulier de la pipe ne peut connecter deux processus interdépendants. Il est créé par un processus et disparaissent lors de la dernière clôture.

Un tube nommé, également appelé FIFO pour son comportement, peut être utilisé pour connecter deux indépendants des processus et existe indépendamment du processus, ce qui signifie qu'il peut exister, même si personne ne l'utilise. Une FIFO est créé à l'aide de l' mkfifo() fonction de la bibliothèque.

Exemple

de l'écrivain.c

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    int fd;
    char * myfifo = "/tmp/myfifo";

    /* create the FIFO (named pipe) */
    mkfifo(myfifo, 0666);

    /* write "Hi" to the FIFO */
    fd = open(myfifo, O_WRONLY);
    write(fd, "Hi", sizeof("Hi"));
    close(fd);

    /* remove the FIFO */
    unlink(myfifo);

    return 0;
}

reader.c

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

#define MAX_BUF 1024

int main()
{
    int fd;
    char * myfifo = "/tmp/myfifo";
    char buf[MAX_BUF];

    /* open, read, and display the message from the FIFO */
    fd = open(myfifo, O_RDONLY);
    read(fd, buf, MAX_BUF);
    printf("Received: %s\n", buf);
    close(fd);

    return 0;
}

Remarque: la vérification d'Erreur était omis dans le code ci-dessus pour plus de simplicité.

42voto

Stephen Points 16714

De la Création de Tuyaux en C, cela vous montre comment faire un fork d'un programme d'utilisation d'un tuyau. Si vous ne voulez pas de fork(), vous pouvez utiliser des canaux nommés.

En outre, vous pouvez obtenir l'effet de l' prog1 | prog2 par l'envoi de la sortie de l' prog1 sur la sortie standard et de la lecture à partir d' stdin en prog2. Vous pouvez également lire stdin par l'ouverture d'un fichier nommé /dev/stdin (mais pas sûr de la portabilité des que).

/*****************************************************************************
 Excerpt from "Linux Programmer's Guide - Chapter 6"
 (C)opyright 1994-1995, Scott Burkett
 ***************************************************************************** 
 MODULE: pipe.c
 *****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
        int     fd[2], nbytes;
        pid_t   childpid;
        char    string[] = "Hello, world!\n";
        char    readbuffer[80];

        pipe(fd);

        if((childpid = fork()) == -1)
        {
                perror("fork");
                exit(1);
        }

        if(childpid == 0)
        {
                /* Child process closes up input side of pipe */
                close(fd[0]);

                /* Send "string" through the output side of pipe */
                write(fd[1], string, (strlen(string)+1));
                exit(0);
        }
        else
        {
                /* Parent process closes up output side of pipe */
                close(fd[1]);

                /* Read in a string from the pipe */
                nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
                printf("Received string: %s", readbuffer);
        }

        return(0);
}

8voto

mlouk Points 51
dup2( STDIN_FILENO, newfd )

Et lire:

char reading[ 1025 ];
int fdin = 0, r_control;
if( dup2( STDIN_FILENO, fdin ) < 0 ){
    perror( "dup2(  )" );
    exit( errno );
}
memset( reading, '\0', 1025 );
while( ( r_control = read( fdin, reading, 1024 ) ) > 0 ){
    printf( "<%s>", reading );
    memset( reading, '\0', 1025 );
}
if( r_control < 0 )
    perror( "read(  )" );    
close( fdin );    

Mais, je pense qu' fcntl peut être une meilleure solution

echo "salut" | code

6voto

Johan Points 2511

Ce qu'un programme écrit dans stdout peut être lu par un autre via stdin. Donc, tout simplement, à l'aide de c, écrivez prog1 d'imprimer quelque chose à l'aide d' printf() et prog2 de lire quelque chose à l'aide de scanf(). Ensuite, il suffit d'exécuter

./prog1 | ./prog2

2voto

lfagundes Points 1032

tout d'abord, avoir le programme 1 écrire la chaîne de caractères sur la sortie standard (si vous souhaitez qu'elle apparaisse à l'écran). puis le deuxième programme doit lire une chaîne de caractères à partir de stdin, comme si l'utilisateur était en tapant sur un clavier. ensuite, vous exécutez:

program_1 | program_2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X