Programm läuft einmal und es wirft beide Daten in die Pipe und ruft es in der gleichen Bedingung aus, die sich gegenseitig ausschließen sollte (in if und sonst). Was ich hier nicht bekomme? Wie funktioniert das? Ich habe keine Erfahrung mit dieser Art der Programmierung.Pipe, fork, wie es möglich ist, dass das Programm ausgeführt wird, wenn und sonst die gleiche Bedingung
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
Lesen Sie die Zeichen aus der Pipe und echo sie auf stdout.
void
read_from_pipe (int file)
{
FILE *stream;
int c;
stream = fdopen (file, "r");
while ((c = fgetc (stream)) != EOF)
putchar (c);
fclose (stream);
}
Schreiben Sie einen beliebigen Text in die Pipe.
void
write_to_pipe (int file)
{
FILE *stream;
stream = fdopen (file, "w");
fprintf (stream, "hello, world!\n");
fprintf (stream, "goodbye, world!\n");
fclose (stream);
}
int
main (void)
{
pid_t pid;
int mypipe[2];
/* Create the pipe. */
if (pipe (mypipe))
{
fprintf (stderr, "Pipe failed.\n");
return EXIT_FAILURE;
}
/* Create the child process. */
pid = fork();
if (pid == (pid_t) 0)
{
/* This is the child process.
Close other end first. */
close (mypipe[1]);
read_from_pipe (mypipe[0]);
return EXIT_SUCCESS;
}
else if (pid < (pid_t) 0)
{
/* The fork failed. */
fprintf (stderr, "Fork failed.\n");
return EXIT_FAILURE;
}
else
{
/* This is the parent process.
Close other end first. */
close (mypipe[0]);
write_to_pipe (mypipe[1]);
return EXIT_SUCCESS;
}
}
Welcher Teil dieses Codes entscheidet, wie viele Programme ich zusammen laufen werde? reicht es, 'int mypipe [2];' zu 'int mypipe [3];' zu ändern, um 3 davon zu haben? – user1291641
Nein, überhaupt nicht. 'pipe' erzeugt keine Prozesse,' fork' tut dies. Sie erhalten jedes Mal einen neuen Prozess, wenn Sie 'fork' aufrufen. Seien Sie vorsichtig damit und lesen Sie die Dokumentation - wenn Sie in einer Schleife "fork" nennen oder nicht darauf achten, welchen Code Sie in dem Kind vs im Elternteil ausführen, erhalten Sie möglicherweise eine "fork bomb". (Lesen Sie auch dazu.) – Mat