PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pipe funktionirt nicht



pfefferkeks
31-05-2005, 09:03
Hi,

in dem unten angegbenen code soll einfach nur eine pipe erzeugt werden und ein zeichen in diese pipe geschrieben werden. nur leider bekomme ich bei dem aufruf:
vater 1 T
bekomme ich leider immer:
Send schlug fehl: : Socket operation on non-socket

Wer kann mir helfen?




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

#define PIPE_BUF2 1

int main(int argc, char **argv) {
int fd[2];
int result=0;
int ressend=0;
int resrecv=0;
int anzahl=0;
pid_t soehne[atoi(argv[1])];
pid_t pidVater=getpid();
int i=0;
char puffer[PIPE_BUF2];

if (2 < argc) {
anzahl = atoi(argv[1]);
if ((argc-2) == anzahl) {

/**
* Pipe anlegen
*/
result = pipe(fd);
if ((-1) == result) {
perror("Bei erzeugen der Pipe ist ein Fehler aufgetretten: ");
exit(-1);
}

/**
* Soehne anlegen
*/
for (i=0; i<anzahl; i++) {
if (getpid() == pidVater) {
soehne[i] = fork();
if ((-1) == soehne[i]) {
perror("Fehler bei fork(): ");
exit(-1);
}
}
}

/**
* Wenn ich der Vater bin Lese- /Schreibseite der Pipe schliessen
*/
if (getpid() == pidVater) {
/* Lese Seite der Pipe schliessen */
close(fd[1]);

/* 1 Zeichen in die PIPE schreiben */
i=2; /*nur fuer die test phase. programm funktionirt dann nur mit "<programmaufruf> 1 T" */
ressend = send(fd[0], argv[i], 1, 0);
if ((-1) == ressend) {
perror("Send schlug fehl: ");
exit(-1);
}
}
}
else {
printf ("Die Anzahl der Zeichen ist Falsch!\n");
}
}
else {
printf ("Falsche Komandozeilenparameter!\nRichtig: Anzahl der Soehne angeben und dann folgend die auszugebenden Zeichen!\n");
}
return 0;



danke pfefferkeks

klewan
31-05-2005, 09:15
is ne pipe nich einfach nur ne pipe und kein socket? :-)

probiers mal mit write(2)

pfefferkeks
31-05-2005, 10:03
:) ok es ist eine PIPE ;)

aber leider soll ich send und receive benutzen. Steht leider so in der Aufgabenstellung.
;(

gruesse pfefferkeks

klewan
31-05-2005, 11:30
welche aufgabenstellung ? :-D

machen wir hier jetzt schon hausaufgaben ?! *fG*


lol na dann musste auch glaub ich nen SOCKET aufmachen
hmmm


lg

pfefferkeks
31-05-2005, 11:38
die die mein professor uns gestellt hat.

da ich die aufgabe ja selbst loessen moechte habe ich euch nur den code gegeben wo der fehler drin auftritt ;)

naja dann werde ich mich mal wider ans testen machen. das muss doch gehen da ich mit write die fehlermeldung eines falschen filedescriptors bekomme ;).

gruesse und danke

klewan
31-05-2005, 13:15
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>

int ChildCode(int writeable_fd) {


}

int main(int argc, char ** argv) {
int fd[2];
int pid;
FILE * fp;
char b,c;
int d;

//printf("Father's Pid: %d", getpid());

if(pipe(fd) < 0) {
perror("pipe");
exit(1);
}
pid=fork();
if(pid <0) {
perror("Fork");
exit(1);
}
if(pid) {
close(fd[1]); //No writing to it
printf("Parent Code\n");
while((d=read(fd[0], &c, 1)) >= 0) {
if(d > 0) {
printf("GOT: %c\n", c);
}

}


} else {
close(fd[0]); //No Reading
printf("Child Code\n");
write(fd[1], "a", 1);
sleep(3);
write(fd[1], "b", 1);
sleep(3);
write(fd[1], "c", 1);
}



}









send/recv is nur für sockets

meinte euer prof vielleicht ihr sollt unix_sockets als ipc verwenden ?

pfefferkeks
31-05-2005, 15:24
Hi,

danke dir.

Dann werde ich wohl noch mal genau nachfragen muessen da in der Aufgabenstellung von einer PIPE und send sowie receive die rede ist.

danke dir gruesse pfefferkeks

klewan
31-05-2005, 15:44
naja du kannst ja auch nen socket als pipe missbrauchen *fG* :-)


edit:
und wenn euer prof pipe(2) verlangt dann muss auch ein beispiel mit write(2) zählen *fg*


am ende is doch nur das ziel das ziel *fG* :-D