In einen externen Prozess schreiben und lesen

29/06/2008 - 14:44 von Paul Meier | Report spam
Hallo,


da ich nur selten mit C zu tun hab, werde ich wohl ewiger
Anfànger bleiben ;-)

Mit folgendem Programmanteil möchte ich einen DB-Client füttern
und würde mich freuen, wenn Ihr einen kritischen Blick drauf
werfen könntet.
Zombies, Time-outs ..

"cat" nimmt hier nur eine stellvertretende Rolle, da ich auf dem
Produktivstem nicht testen möchte.

Gruß P.


###############################################################

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>

#define BUF 4096
#define Abbruch(s) { fprintf(stderr, "%s", s);
exit(EXIT_FAILURE); }

sig_atomic_t keep_going = 1;
ssize_t i = 0;

void
catch_alarm (int sig) {
keep_going = 0;
fprintf(stderr, "timeout");
signal (sig, catch_alarm);
}

int
main (int argc, char **argv) {
enum { ERROR = -1, SUCCESS };
int fd1[2], fd2[2], pid;
char c[BUF];

if ( argc < 2 )
Abbruch( "arguments?" );

/* 1. pipe. */
if ( pipe(fd1) == ERROR )
Abbruch( "pipe?" );

/* 2. pipe. */
if ( pipe(fd2) == ERROR )
Abbruch( "pipe?" );

/* child argv[1] program argv[2] a string **** */
if ( (pid = fork()) == SUCCESS ) {
close( fd1[1] );
close( fd2[0] );

if ( dup2(fd1[0], STDIN_FILENO) != STDIN_FILENO ) {
Abbruch("Fehler bei dup2 reading...");
}
else {
close( fd1[0] );
}

if ( dup2( fd2[1], STDOUT_FILENO ) != STDOUT_FILENO ) {
Abbruch("Fehler bei dup2 writing...");
}
else {
close( fd2[1] );
}

if ( execl("/bin/cat", "pipe", "-", NULL) == ERROR )
Abbruch ("Fehler bei dup2 writing...");
}

/* Fehler fork ****************************************** */
else if ( pid == ERROR ) { Abbruch("Fehler bei fork..."); }

/* Vater ************************************************ */
else {
close( fd1[0] );
close( fd2[1] );

if ( strlen(argv[2]) < BUF ) {
signal (SIGALRM, catch_alarm);
alarm (10);

write( fd1[1], argv[2], strlen(argv[2]) );

do { i = read( fd2[0], c, BUF ); }
while ( i == 0 && keep_going);

puts( c );
close( fd1[1] );
close( fd2[0] );
}
else {
close( fd1[1] );
close( fd2[0] );
Abbruch ("Fehler bei dup2 writing...");
}
return(0);
}
return 0;
}
 

Lesen sie die antworten

#1 Claus Reibenstein
29/06/2008 - 23:27 | Warnen spam
Paul Meier schrieb:

Zombies, Time-outs ..



Gibt es in C nicht.

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



All díese Header sind nicht Bestandteil von C.

Dein Programm bewegt sich weitgehend auf systemspezifischen Bahnen, die
durch den C-Standard nicht abgedeckt sind. Bitte stelle Deine Frage in
einer Gruppe, die sich mit der Programmierung unter Deinem
Betriebssystem beschàftigt. "unistd.h" làsst auf ein unixoides System
schließen. Daher würde ich news:de.comp.os.unix.programming vorschlagen.

Gruß. Claus

Ähnliche fragen