thomason993 Δημοσ. 17 Απριλίου 2016 Δημοσ. 17 Απριλίου 2016 Έχω την εξής συνάρτηση που εξυπηρετεί ένα custom system call σε MINIX: Σκοπός της συνάρτησης είναι να τυπώνει το πλήθος των διεργασιών και το άθροισμα των user time και system time όλων των διεργασιών που τρέχουν τη συγκεκριμένη χρονική στιγμή στο ΛΣ. Το πρόβλημα είναι οτι αφού υπολογίσω αυτα που θέλω, όταν πάω να τα εκτυπώσω στις τελευταίες γραμμές, ενώ το πλήθος των processes και το συνολικό user time εμφανίζονται σωστά, το system time εμφανίζεται 0. Το περίεργο είναι οτι αν βάλω να εκτυπώνεται οτιδήποτε μεσα στη while που έχω πιο πάνω (αφαιρώντας τα // από τις γραμμές σχόλια) τότε το συνολικό system time υπολογίζεται σωστά (!) Έχει κανένας ιδέα γιατί γίνεται αυτό το κουλό??
Moderators Kercyn Δημοσ. 17 Απριλίου 2016 Moderators Δημοσ. 17 Απριλίου 2016 Να σου πω γιατί δεν ξέρω, αλλά βρήκα αυτό που ίσως σε βοηθήσει. http://stackoverflow.com/questions/1083142/what-s-the-correct-way-to-use-printf-to-print-a-clock-t
bnvdarklord Δημοσ. 17 Απριλίου 2016 Δημοσ. 17 Απριλίου 2016 Εντελώς υποθετικά χωρίς να έχω βαθιές γνώσεις ΛΣ: αν το system time επηρρεάζεται από τις εφαρμογές που τρέχουν στον υπολογιστή σου, υπάρχει άραγε περίπτωση τα (πολύ αργά)printf στο while να επηρρεάζουν το αποτέλεσμα; (αμελητέο πριν+μικρη ακρίβεια vs μη αμελητέο επειδη καθυστερεί το cpu η κονσοόλα) Αν ισχύει αυτό, ανοίγοντας στο πλάι ένα δεύτερο πρόγραμμα που απλά τυπώνει για πάντα στην κονσόλα βλακείες, θα κάνει το δικό σου πρόγραμμα να βγάλει system time !=0
thomason993 Δημοσ. 17 Απριλίου 2016 Μέλος Δημοσ. 17 Απριλίου 2016 Να σου πω γιατί δεν ξέρω, αλλά βρήκα αυτό που ίσως σε βοηθήσει. http://stackoverflow.com/questions/1083142/what-s-the-correct-way-to-use-printf-to-print-a-clock-t Δοκίμασα αυτό που λέει ο τυπάς στο Link που έδωσες, έκανα printf τα clock_t σαν unsigned long long int (που είναι το ίδιο με το uintmax_t) αλλά και πάλι το system time είναι 0. Ευχαριστώ για την ιδέα πάντως Εντελώς υποθετικά χωρίς να έχω βαθιές γνώσεις ΛΣ: αν το system time επηρρεάζεται από τις εφαρμογές που τρέχουν στον υπολογιστή σου, υπάρχει άραγε περίπτωση τα (πολύ αργά)printf στο while να επηρρεάζουν το αποτέλεσμα; (αμελητέο πριν+μικρη ακρίβεια vs μη αμελητέο επειδη καθυστερεί το cpu η κονσοόλα) Αν ισχύει αυτό, ανοίγοντας στο πλάι ένα δεύτερο πρόγραμμα που απλά τυπώνει για πάντα στην κονσόλα βλακείες, θα κάνει το δικό σου πρόγραμμα να βγάλει system time !=0 Λογικό μου φαίνεται αυτό που λες.. έβαλα όμως ένα πρόγραμμα σε ξεχωριστό terminal να εμφανίζει επ άπειρο την ίδια λέξη και στο αρχικό terminal έτρεξα πάλι το πρόγραμμα, αλλά και πάλι το system time είναι 0.. το πλήθος των processes βέβαια αυξήθηκε κατά 1, όπως και θα πρεπε.. άρα τουλάχιστον αυτό δουλεύει σωστά σίγουρα. edit: Ίσως το κάθε terminal βέβαια να έχει το δικό του system time, ξεχωριστό από των άλλων terminals.. Γιατί τώρα έβαλα σε κάθε επανάληψη να εμφανίζεται το total_sys_time και όντως εμφανίζεται μεγαλύτερο σε κάθε επανάληψη και το τελικό αποτέλεσμα είναι πάλι σωστό.. τι να πω..
tsofras Δημοσ. 17 Απριλίου 2016 Δημοσ. 17 Απριλίου 2016 Αν και C έχω να ακουμπήσω πάνω απο 12 χρόνια και δεν θυμάμαι τίποτα, το πρόβλημα σου φένεται θεωρητικά στον κώδικα που έχεις ποστάρει? Γιατί στα σχόλια κάνεις print την μεταβλητή proc_sys_time που λές ότι τυπώνεται αν το κάνεις uncomment , ενώ στο τέλος του προγράμματος τυπώνεις την μεταβλητή total_sys_time
thomason993 Δημοσ. 17 Απριλίου 2016 Μέλος Δημοσ. 17 Απριλίου 2016 Αν και C έχω να ακουμπήσω πάνω απο 12 χρόνια και δεν θυμάμαι τίποτα, το πρόβλημα σου φένεται θεωρητικά στον κώδικα που έχεις ποστάρει? Γιατί στα σχόλια κάνεις print την μεταβλητή proc_sys_time που λές ότι τυπώνεται αν το κάνεις uncomment , ενώ στο τέλος του προγράμματος τυπώνεις την μεταβλητή total_sys_time Στα σχόλια η εκτύπωση της μεταβλητής proc_sys_time είναι για δοκιμή.. και το απλό Hello! να τυπώσω, το total_sys_time στο τελος εκτυπώνεται σωστά.. αντίθετα αν δεν εμφανίζω τίποτα μέσα στη while, το total_sys_time θα εκτυπωθεί 0 στο τέλος, το οποίο μου φαίνεται περίεργο.. Βέβαια παίζει όντως η μικρή ακρίβεια των αριθμών σε συνδυασμό με το πολύ μικρο sys time αν δεν υπάρχουν printf (τα οποια προσθέτουν αρκετό χρόνο) να δίνει sys time 0.
tsofras Δημοσ. 17 Απριλίου 2016 Δημοσ. 17 Απριλίου 2016 βάλε τότε ένα sleep για ένα δευτερόλεπτο μετά την while για να δείς αν όντως είναι αυτό
M2000 Δημοσ. 17 Απριλίου 2016 Δημοσ. 17 Απριλίου 2016 Παίζει να είναι το refresh της κονσόλας αυτό που κάνει την απαιτούμενη καθυστέρηση, και την κάνει μέσω print. Το ρώτημα είναι αν δουλεύει και με κενό printf ή με μόνο string, όπως το Hello. Παίζει και η αλλαγή γραμμής να πυροδοτεί την ανανέωση! Υπόθεση κάνω...
thomason993 Δημοσ. 17 Απριλίου 2016 Μέλος Δημοσ. 17 Απριλίου 2016 Τελικά όντως, όταν δεν υπάρχει printf, το proc_sys_time που επιστρέφει η συνάρτηση sys_times είναι 0. Με printf μέσα στην while, το proc_sys_time έχει στάνταρ τιμή σε κάθε επανάληψη, άρα και το total sys time είναι >0. Με εντολή sleep(1); αντί για printf μέσα στο while, το πρόγραμμα τρέχει το ίδιο γρήγορα (δεν κάνει sleep δηλαδή) και αντ' αυτού σε κάθε επανάληψη που είναι να κάνει sleep πετάει το μήνυμα: "sys_call: ipc mask denied SENDREC from 0 to 0". Φαντάζομαι επειδή η συνάρτηση είναι handler για system call, ο kernel του MINIX για κάποιο λόγο απαγορεύει την εκτέλεση sleep μέσα της (?). Επίσης, στην ίδια περίπτωση, παρά το οτι το πρόγραμμα δεν κάνει πουθενά sleep, το τελικό total sys time έχει τιμή >0 το οποίο φαντάζομαι είναι σωστό. Anyways, από τα παραπάνω πιστεύω οτι το 0 είναι όντως σωστό νούμερο τελικά για το total sys time, καθώς όταν δεν εκτελείται καμία άλλη χρονοβόρα ενέργεια στο ΛΣ, θεωρεί το sys time αμελητέο, άρα 0.
gifour Δημοσ. 15 Σεπτεμβρίου 2016 Δημοσ. 15 Σεπτεμβρίου 2016 Καλησπέρα θα ήθελα να ρωτήσω για κάτι που αφορά την σύνταξη στον κώδικα και δεν το κατάλαβα, καθώς οι γνώσεις μου περιορίζονται στα βασικά. Βλέπω πως στη function χρησιμοποιείται ένα data type struct mproc και ένας pointer mp που προορίζεται να δείξει σε μια value αυτού του τύπου. Αμέσως πιο κάτω γίνεται assign στον pointer mp η &mproc. Εδώ μπερδεύτηκα γιατί βλέπω data type struct mproc *mp = &array node struct mproc mproc. Δηλαδή ο array mproc[x] είναι στην ουσία mproc mproc[x] με data type typedef struct mproc{ .... .... }; Αν ναι, τότε γιατί ανακοινώνεται στην αρχή struct mproc *mp και όχι mproc *mp;
defacer Δημοσ. 15 Σεπτεμβρίου 2016 Δημοσ. 15 Σεπτεμβρίου 2016 H C έχει διαφορετικά "namespaces" για τα διάφορα είδη identifiers. Συγκεκριμένα, τα ονόματα των struct και τα ονόματα των μεταβλητών ή typedefs βρίσκονται σε διαφορετικό namespace. Οπότε αν έγραφες "mproc *mp" θα σου έλεγε είτε δεν ξέρω τι είναι το mproc είτε ότι δεν είναι type (εδώ υπάρχει μεταβλητή μ' αυτό το όνομα). Αυτός είναι και ο λόγος που μπορείς να γράψεις typedef struct foo {} foo; // βάζει το foo στο namespace των struct KAI των typedefs struct foo f1; // works foo f2; // works αλλά δε μπορείς να κάνεις αυτό struct foo {}; // μόνο στο namespace των struct struct foo f1; // works foo f2; // unknown type name "foo" 3
imitheos Δημοσ. 16 Σεπτεμβρίου 2016 Δημοσ. 16 Σεπτεμβρίου 2016 αλλά δε μπορείς να κάνεις αυτό struct foo {}; // μόνο στο namespace των struct struct foo f1; // works foo f2; // unknown type name "foo" Είναι ακριβώς όπως το λέει ο defacer απλά να συμπληρώσω κάτι. Μπορεί να έρθει κάποιος και να πει "εγώ ρε μεγάλε το χρησιμοποιώ χρόνια σαν mproc τάδε και παίζει". Μερικά προγραμματιστικά περιβάλλοντα παρέχουν μόνο C++ compiler και όχι C compiler. Πολλές φορές ο χρήστης δεν το καταλαβαίνει γιατί το 99% της σύνταξης της C έχει το ίδιο αποτέλεσμα αν γίνει compile σαν C++. Υπάρχουν όμως κάποιες διαφοροποιήσεις στην συμπεριφορά με αυτή να είναι μία από αυτές. Στην C++ μπορείς να παραλείψεις το struct εφόσον αυτό δεν προκαλεί σύγκρουση με κάποιον άλλον τύπο. Έτσι στο παράδειγμα του defacer μπορείς να γράψεις "foo f2". Ας δούμε παρακάτω ένα χαζό κώδικα που δεν κάνει τίποτα. struct foo { int mitsos; }; int main(void) { struct foo foo1; foo foo2; return 0; } Ας κάνουμε τώρα compile τον παραπάνω κώδικα: % gcc tmp.c tmp.c: In function ‘main’: tmp.c:8:2: σφάλμα: unknown type name ‘foo’ foo foo2; ^~~ tmp.c:8:2: σημείωση: use ‘struct’ keyword to refer to the type % g++ tmp.c Όπως βλέπεις, αν κάνω compile με τον C compiler, παίρνω ακριβώς το μήνυμα λάθους που σου είπε ο defacer και με προτρέπει ο compiler να προσθέσω το πρόθεμα struct. Αντίθετα όμως, όταν κάνω compile με τον C++ compiler, όλα παίζουν τζάμι. Αν λοιπόν πρόσεξες σε διάφορα projects να παραλείπουν το struct είναι είτε επειδή ορίζουν την δομή με κάποιο typedef όπως σου έδειξε ο defacer ή γιατί γράφουν "c++". 3
gifour Δημοσ. 16 Σεπτεμβρίου 2016 Δημοσ. 16 Σεπτεμβρίου 2016 Άρα οι δηλώσεις που έχουν γίνει νωρίτερα έξω από αυτή τη function σίγουρα είναι οι: struct mproc{ }; struct mproc mproc[ ]; εφόσον το πρόγραμμα δουλεύει έχοντας γίνει compile με κάποιον c compiler και όχι c++ compiler. οκ το κατάλαβα Σας ευχαριστώ @deface @imitheos
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα