Buonasera ragazzi, ho un esame che si avvicina drasticamente, in cui ho voluto realizzare un programma dimostrativo delle varie system call, il tutto accompagnato da un'interfaccia grafica fatta con le gtk, questa è la mia prima esperienza di programmazione in c, quindi accetto volentieri delle critiche.
Vi spiego i problemi, la grafica è composto da un GTKTREEVIEW dove ci sono le varie funzioni selezionabili, poi ci sono 3 text view che utilizzo per visualizzare a video il codice sorgente, scrivere l'output delle funzioni, e la terza per prendere in input da tastiera.
Alla GtkTreeView ho applicato un g_signal così che verifica quando viene cambiata la selezione e fa partire la funzione richiesta.
con questi tre metodi gestico le textview, i metodi ovviamente sono dichiarati in un header che poi richiamo dai sorgenti delle funzioni:
codice:volatile gint scritto; void add_to_view_4code(GtkWidget *textview4code , gchar *text) { GtkTextBuffer *buffer; buffer =gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview4code)); gtk_text_buffer_set_text (buffer, text, -1); } void add_to_view_4write( GtkWidget *textview4write , gchar *text){ gdk_threads_enter (); GtkTextBuffer *buffer; GtkTextIter iter; buffer =gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview4write)); gtk_text_buffer_get_end_iter (buffer,&iter) ; gtk_text_buffer_insert (buffer, &iter, text, -1); gdk_threads_leave (); } gchar *read_from_view (GtkWidget *textview4read ){ scritto=FALSE; while (!scritto) sleep(1); gdk_threads_enter (); GtkTextBuffer *buffer; GtkTextIter start_iter; GtkTextIter end_iter; buffer =gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview4read)); gtk_text_buffer_get_end_iter (buffer,&end_iter) ; gtk_text_buffer_get_start_iter (buffer,&start_iter) ; gchar *read; read=gtk_text_buffer_get_text (buffer, &start_iter, &end_iter, TRUE); gtk_text_buffer_set_text (buffer, "", -1); gdk_threads_leave (); return g_strconcat(read, "\n", NULL); }
questo metodo invece è collegato alla view per leggere da tastiera:
codice:static gint key_press(GtkWidget *textview4read, GdkEventKey *event) { GtkTextBuffer *buffer; GtkTextIter end_iter; buffer =gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview4read)); gtk_text_buffer_get_end_iter (buffer,&end_iter) ; if(event->keyval == 65293 ){ g_print("tasto INVIO trovato!!!!\n"); scritto=TRUE; } else gtk_text_buffer_insert (buffer, &end_iter, event->string, 1); //per questo sono quasi sempre tenuto ad aggiungere un solo carattere }
e fin qui tutto funziona, purtroppo io chiamo le funzioni (le quali non sono su un' altro sorgente) e per non far bloccare la grafica le chiamo come threads e gli passo una una struttura che dichiaro come tipo nell'header structure.h, ad esempio:
struttura nell'header:
typedef struct
{
GtkWidget *codeview;
GtkWidget *viewWrite;
GtkWidget *viewRead;
GtkWidget *tree;
} threads_args;
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <gtk/gtk.h>
#include "structure.h"
#include "mioheader.h"
int forkf(void *args) {
gchar *msg;
threads_args *data = (threads_args *)args;
GtkWidget *viewWrite = data->viewWrite;
pid_t pid;
msg="Ciao io sono un processo, ora creo un figlio\n";
add_to_view_4write (viewWrite, msg );
sleep(2);
//Creo un filgio e controllo che non ci siano errori
if ( (pid = fork()) < 0)
perror("Errore fork");
else if (pid == 0) {
//figlio
msg="pen";
//msg="Ciao io sono il figlio, vi elenco i miei dati:\n pid = %d, parent pid = %d, uid = %d, gid = %d \n", getpid(), //getppid(), getuid(),getgid();
add_to_view_4write (viewWrite, msg);
}
else{ //padre
sleep(2);
msg= g_strconcat("Io sono il padre di " , "ca" , NULL);
//msg= ("Io sono il padre di %d, vi elenco i miei dati:\n pid = %d, parent pid = %d, uid = %d, gid = %d \n",pid, getpid(), //getppid(), getuid(),getgid());
add_to_view_4write (viewWrite, msg);
}
del mio codice funziona tutto, tranne quando crea un processo figlio, il metodo add_to_view_4write viene chiamato però non fa niente, speravo che facendo una fork, il processo figlio "ereditava" tutti i puntatori, invece non sembrerebbe...
Che ne pensate?
Inoltre inizio a pensare che sia meglio g_lockare la variabile volatile che utilizzo per sapere quando l'utente preme invio confermando il messaggio che ha scritto.
come potete vedere nell'ultimo codice c'è una stringa commentata:
//msg= ("Io sono il padre di %d, vi elenco i miei dati:\n pid = %d, parent pid = %d, uid = %d, gid = %d \n",pid, getpid(), //getppid(), getuid(),getgid());
in precedenza questa era un printf e ovviamente funzionava, sembrera banale ma non riesco a fare un cast funzionante di tutti i pid, getpid eccetera per passare la stringa al metodo add_to_view_4write..
So che sembra un casino, però il tempo stringe veramente e non so più che fare!!!
Spero di essere stato chiaro su tutto, altrimenti non esitate a chiedere.
Grazie in anticipo a tutti.