Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [C] Problemen met IPC d.m.v. pipen tussen parent en child proces  (gelezen 1075 keer)

Offline Joshua822

  • Lid
Hallo allemaal!

Ja, eindelijk ben ik eens begonnen met "Interprocess comunnication". De simpelste techniek om te beginnen hiervoor is "pipen", heb ik mij laten vertellen. Dus dat heb ik vandaag deze techniek onderzocht. Maar helaas zonder succes.

Ik heb het volgende programma geschreven, de bedoeling is dat het "child" proces de tekst "Hallo wereld!", die het proces van het "parent" proces krijgt, op het scherm print. Dit heb ik zo geprogrammeerd:
#include <stdio.h>
#include <stdlib.h>

int main ( void )
{
    unsigned char buf_for_child [ 20 ];
    signed int pid;
    FILE * pipe_stream;
    pid = fork ( );
    if ( pid == -1 )
    {
        printf ( "Er trad een fout op.\n" );
        return 0;
    }
    else
    {
        pipe_stream = popen ( ( char * ) pid, "w" );
    }
    if ( pid )
    {
        fprintf ( pipe_stream, "Hallo wereld!" );
    }
    if ( !pid )
    {
        if ( pipe_stream )
        {
            fscanf ( pipe_stream, "%s", buf_for_child );
            printf ( "%s", buf_for_child );
        }
        exit ( 0 );
    }
    pclose ( pipe_stream );
    return 0;
}


Dit compileert goed, en zou moeten werken. Maar als ik het gecompileerde programma probeer uit te voeren krijg ik rare foutmeldingen zoals deze:


Weet iemand wat hier het probleem is? Alvast hartelijk bedankt.

Re: [C] Problemen met IPC d.m.v. pipen tussen parent en child proces
« Reactie #1 Gepost op: 2010/01/24, 10:47:04 »
Ja.

http://seysayux.users.sourceforge.net/cecinestpasunpipe.jpg

;)

pipes werken alleen zoals de | in de shell. Je moet dus een pad naar een binary opgeven en geen pid.
« Laatst bewerkt op: 2010/01/24, 10:49:53 door SeySayux »
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Joshua822

  • Lid
Re: [C] Problemen met IPC d.m.v. pipen tussen parent en child proces
« Reactie #2 Gepost op: 2010/01/24, 12:51:37 »
Citaat
pipes werken alleen zoals de | in de shell. Je moet dus een pad naar een binary opgeven en geen pid.

Oké, dank je voor de informatie. Maar hoe moet ik dan in een andere binary een pipe uitlezen die in een ander proces aangemaakt is ?  ???

Voor een ouder- en kindproces is het antwoord trouwens simpel: je kunt in deze situatie doen aan low level piping met de functies "pipe", "close", "read" en "write".

Re: [C] Problemen met IPC d.m.v. pipen tussen parent en child proces
« Reactie #3 Gepost op: 2010/01/24, 13:06:53 »
Zoveel weet ik ook niet van pipes. Maar het feit alleen al dat je een int naar een char* cast zegt me dat er iets fout is :P
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Joshua822

  • Lid
Re: [C] Problemen met IPC d.m.v. pipen tussen parent en child proces
« Reactie #4 Gepost op: 2010/01/24, 14:52:44 »
Ja, inderdaad, dat vorige programma trok nergens op :P

Ik heb hier een nieuw programma dat gebruik maakt van "low level piping":
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main ( void )
{
    unsigned int pijp [ 2 ];
    unsigned char fork_waarde, unsigned char buffer [ 20 ] = "Hallo wereld!";
    pipe ( pijp );
    fork_waarde = fork ( );
    if ( fork_waarde == -1 )
    {
        printf ( "Er trad een fout op: de functie fork() faalde." );
        return 0;
    }
    else if ( fork_waarde )
    {
        close ( pijp [ 0 ] );
        write ( pijp [ 1 ], buffer, strlen ( buffer ) + 1 );
    }
    else
    {
        close ( pijp [ 1 ] );
        read ( pijp [ 0 ], buffer, strlen ( buffer ) + 1 );
        printf ( buffer );
    }
    return 0;
}


Maar er is een probleem, ik kan niet overal de "char array" variabel "buffer" gebruiken, ik krijg bij het compileren de volgende fout:
main.c:19: error: ‘buffer’ undeclared (first use in this function)
main.c:19: error: (Each undeclared identifier is reported only once
main.c:19: error: for each function it appears in.)
Ik vind dit redelijk raar. Wat gaat er mis?

Offline Joshua822

  • Lid
Re: [C] Problemen met IPC d.m.v. pipen tussen parent en child proces
« Reactie #5 Gepost op: 2010/01/25, 19:26:27 »
Och, wat een domme fouten die ik in de broncode in de vorige post maakte, zo zou het moeten zijn:
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main ( void )
{
    unsigned int pijp [ 2 ];
    unsigned char fork_waarde, buffer [ 20 ] = "Hallo wereld!";
    pipe ( pijp );
    fork_waarde = fork ( );
    if ( fork_waarde == -1 )
    {
        printf ( "Er trad een fout op: de functie fork() faalde." );
        return 0;
    }
    else if ( fork_waarde )
    {
        close ( pijp [ 0 ] );
        write ( pijp [ 1 ], buffer, strlen ( buffer ) + 1 );
    }
    else
    {
        close ( pijp [ 1 ] );
        read ( pijp [ 0 ], buffer, strlen ( buffer ) + 1 );
        printf ( "%s", buffer );
    }
    return 0;
}