Hej,

Chciałbym stworzyć sobie prosty programik. Na wciśnięcie 1 guzika chciałbym wygenerować proces zombie, 2 guzik będzie generował proces sierotę, 3 guzik miałby generować plik w którym będzie nr procesu i znacznik Z/S.
Mam kilka problemów:

  1. Po wygenerowaniu sieroty zabijam proces macierzysty i tym samym zabijam wszystkie zombie stworzone do tej pory(ponieważ jest to ich proces macierzysty) - może da się tego uniknąć?
  2. Jeżeli nie to może dałoby radę wyzerować od razu licznik(na gui) procesów zombie przy tworzeniu sieroty?
  3. Chciałem sprytnie:) pidy zapisywać do tablicy, w przypadku sierot nie mam problemu natomiast w przypadku zombie tablica jest pusta. Rozumiem, że ona ginie wraz z procesem?
    Poniżej moje wypociny...
#include <gtk/gtk.h>

gint zombies = 0;
gint orphans = 0;
char buf[5];
gint volatile pidZombies[100]; 
gint pidOrphans[100];

void createZombie(GtkWidget *widget, gpointer label) {
    zombies++;
    sprintf(buf, "%d", zombies);
    gtk_label_set_text(GTK_LABEL(label), buf);
    if (fork() == 0){
	pidZombies[(zombies-1)%100] = getpid();
	printf("Zombie (%d) has just been raised!\n", pidZombies[zombies-1]);
	exit(0);
    }
}

void createOrphan(GtkWidget *widget, gpointer label) {
    orphans++;
    sprintf(buf, "%d", orphans);
    gtk_label_set_text(GTK_LABEL(label), buf);
    if(fork() == 0) {
	pidOrphans[orphans-1] = getpid();
	printf("Orphan (%d) has just been raised!\n", pidOrphans[orphans-1]);
	sleep(1);
    } else {
    exit(0);
    }
}

void generateReport(GtkWidget *widget){
    gint i;
    for(i = 0; i < zombies; i++){
	/*tu bedzie zapis do pliku*/
    }

}

int main(int argc, char** argv) {

  printf("Start PID: %d, PPID: %d\n", getpid(), getppid());

  GtkWidget *zombieLabel;
  GtkWidget *orphanLabel;
  GtkWidget *window;
  GtkWidget *frame;
  GtkWidget *zombieButton;
  GtkWidget *orphanButton;
  GtkWidget *hseparator;
  GtkWidget *reportButton;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 270, 200);
  gtk_window_set_title(GTK_WINDOW(window), "ZOMBIES VS ORPHANS");

  frame = gtk_fixed_new();
  gtk_container_add(GTK_CONTAINER(window), frame);

  zombieButton = gtk_button_new_with_label("ZOMBIE");
  gtk_widget_set_size_request(zombieButton, 80, 35);
  gtk_fixed_put(GTK_FIXED(frame), zombieButton, 50, 20);

  reportButton = gtk_button_new_with_label("Report");
  gtk_widget_set_size_request(reportButton, 60, 30);
  gtk_fixed_put(GTK_FIXED(frame), reportButton, 200, 160 );

  orphanButton = gtk_button_new_with_label("ORPHAN");
  gtk_widget_set_size_request(orphanButton, 80, 35);
  gtk_fixed_put(GTK_FIXED(frame), orphanButton, 50, 80);

  zombieLabel = gtk_label_new("0");
  orphanLabel = gtk_label_new("0");
  gtk_fixed_put(GTK_FIXED(frame), zombieLabel, 190, 20);
  gtk_fixed_put(GTK_FIXED(frame), orphanLabel, 190, 80); 

  hseparator = gtk_hseparator_new();
  gtk_widget_set_size_request(hseparator, 250, 1);
  gtk_fixed_put(GTK_FIXED(frame), hseparator, 10, 70);

  gtk_widget_show_all(window);

  g_signal_connect(window, "destroy",
      G_CALLBACK (gtk_main_quit), NULL);

  g_signal_connect(zombieButton, "clicked", 
      G_CALLBACK(createZombie), zombieLabel);

  g_signal_connect(orphanButton, "clicked", 
      G_CALLBACK(createOrphan), orphanLabel);

  g_signal_connect(reportButton, "clicked",
      G_CALLBACK(generateReport), NULL);

  gtk_main();

  return 0;
}