004
13.05.2010, 22:04 Uhr
~Giarome
Gast
|
Danke für die Anregungen! Du hattest recht, dass der Vater immer neue Kindprozesse generiert, aber das lag nicht am WNOHANG. ich habe mal einen anderen Ansatz gewählt, nämlich, dass erst nach der Eingabe geforkt wird und nicht schon davor (was streng genommen auch mehr sinn macht). Hier der Code:
main.c
C++: |
#include "teatimer.h"
int main() { child(); return 0; }
|
teatimer.h
teatimer.c
C++: |
#include "teatimer.h" #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <errno.h>
void collect_dead_children() { pid_t res; while((res = waitpid(-1,NULL,WNOHANG)) > 0); if ((res = -1)) if (errno != ECHILD) { perror("waitpid"); exit(EXIT_FAILURE); } }
void child() { while (1) { int timer = 0; char tea[100] = {0}; pid_t pid; printf("Timer> "); if (scanf("%d",&timer) < 1) { printf("Input error.\n"); exit(EXIT_FAILURE); } printf("Tea> "); scanf("%99s",tea);
collect_dead_children(); pid = fork(); switch (pid) { case -1: { perror("fork failed."); exit(EXIT_FAILURE); } case 0: { pid_t child = getpid(); printf("%d forked by %d.\n",child,getppid()); if (sleep(timer)) { perror("sleep interrupted."); exit(EXIT_FAILURE); } printf("%s ready.(%d)\n",tea,child); exit(EXIT_SUCCESS); } default: { printf("%d forked %d.\n",getpid(),pid); } } } }
|
compiliert mit: gcc -Wall -ansi -pedantic main.c teatimer.c -o teatimer alles soweit ok, Programm läuft, wie es soll. Nur jetzt habe ich das Problem, dass meine Ein-/Ausgabe in falschen Zeilen erscheint, wenn z.B. ein Prozess fertig wird, bevor ich die eingabe getätigt habe. Noch Ideen?!
mfg R |