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:
- 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ąć?
- Jeżeli nie to może dałoby radę wyzerować od razu licznik(na gui) procesów zombie przy tworzeniu sieroty?
- 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;
}