PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : signals, pipe und fork



mithras
02-10-2002, 21:11
Hab spaßes halber mal ein Programm geschrieben, dabei soll der eine Prozess wenn der usr eine 1 eingegeben hat den anderen durch ein signal beenden!



#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <ctype.h>


int fkt(pid_t pidnr);

int main(void)
{

int fd[2];
pid_t pid;


if (pipe(fd) < 0 )
puts("fehler bei pipe");

switch (pid=fork())
{
case -1:
{
puts("fehler fork!");
break;
}





case 0:
{// Kind
int e = 0;

while(1)
{
pid_t pidback;

sleep(2);

close(fd[1]);
read(fd[0], pidback , 100);

printf("\nPID2: %d\n", pidback);
puts("Um anderen Prozess zu killen bitte 1 eingeben!");

scanf("%d", &e);

if ( e == 1)
{
fkt(pidback);
sleep(1);
}
}

break;
}







default:
{//Eltern
pid_t pidrw;

pidrw = getpid();

puts("Ich werde ausgeführt!!");
puts("Und werde wenn die Fkt. ausgeführt wird gekillt!");
printf("\nPID1: %d\n", pidrw);

while(1)
{

close(fd[0]);
write(fd[1], pidrw, sizeof(pidrw));

puts("010101");
sleep(1);
}


break;
}
}



return 0;
}



int fkt(pid_t pidnr)
{
puts("Sende kill Signal!");

kill(pidnr, SIGINT);
//raise(SIGINT);

puts("gekillt!");

return 0;
}


Ich lasse die PID auslesen, dann wird die PIP via Pipe an anderen Prozess geschickt, dort wird die Fkt aufgerufen und schickt Signal an den PRozess.
Problem: Es scheint Probs mit
read(fd[0], pidback , 100);

zu geben, denn "PID2: %d\n", pidback"
"Um anderen Prozess zu killen bitte 1 eingeben!"

wird nicht angezeigt!

anda_skoa
03-10-2002, 10:07
Hmm, ich kenn mit nicht pipes nicht aus, aber wenn der eine auf fd[0] wartet, soll der andere wirklich fd[0] schließen?

Ciao,
_

mithras
03-10-2002, 10:44
jo. fd[0] = lesen aus der pipe, fd[1] = schreiben in die pipe
wenn du lesen willlst musst du die schreibseite also fd[1] schliesen, wenn du schreiben wwillst musst du die leseseite also fd[0] schliessen.

Aber ich frage mich wirklich warum der da an der ausführung bei read hängt!?

anda_skoa
03-10-2002, 11:23
Gibt write den ertwarteten Return Wert?

Ciao,
_

mithras
03-10-2002, 12:59
es scheint ein Prob bei write zu sein, denn write liefert als fehler: bad adress zurück!

So hab den Fehler gefunden!
w = write(fd[1], &pidrw, sizeof(pidrw));

hab bei write und read den & operator vergessen...

The Ripper
03-10-2002, 13:46
write(fd[1], pidrw, sizeof(pidrw));

müsste eigentlich so lauten:
write(fd[1], &pidrw, sizeof(pidrw));

analog dazu bei read:
read(fd[0], &pidback, sizeof(pid_t));