narbi Δημοσ. 1 Μαΐου 2008 Δημοσ. 1 Μαΐου 2008 Καλημέρα σε όλους! Έχω φτιάξει ένα πρόγραμμα σε C που προορίζεται για εκτέλεση σε linux. Το πρόγραμμα πρεέπει να κάνει τα εξής: Να τρέχει το πρόγραμμα στο οποίο μια διεργασία αφού ελέγχει την τιμή της προτεραιότητάς της, αν αυτή είναι μικρότερη από το 8, τότε θα την υποβαθμίζει σε 8. Έπειτα να ελέγχει ποιος είναι ο βασικός της κατάλογος, στη συνέχεια βρίσκει όλες τις διεργασίες που τρέχουν στο σύστημα και αποθηκεύει τα δεδομένα σε ένα αρχείο με όνομα processes.txt στο βασικό κατάλογό της. Στη συνέχεια δημιουργεί μία νέα διεργασία. Η θυγατρική διεργασία θα ανοίγει το αρχείο processes.txt και θα διαβάζει τις ταυτότητες των διεργασιών. Στη συνέχεια προσπαθεί να τερματίσει τις διεργασίες αυτές και αναφέρει αν ο τερματισμός πέτυχε ή όχι και για ποια διεργασία. Στο διάστημα αυτό η πατρική της διεργασία πρεπει να περιμένει την ολοκλήρωσή της. Εχω φτιάξει τον κώδικα (ή τουλάχιστον έτσι νομίζω) και θέλω να την εκτελέσω για να δω αν τρέχει ή αν έχει λάθη. Δυστυχώς όμως δεν έχω κάποια έκδοση linux και το Minix που έχω δεν κάνει τη δουλειά αυτή. Θα παρακαλούσα λοι΄πον αν κάποιος από εσας μπορεί να τρέξει τον κώδικα ή έστω να τον κοιτάξει και να μου πει εαν υπάρχουν σφάλματα και να μου τα επισημάνει απλώς.Δεν ζητάω λύσεις,απλώς επισημάνσεις αν γίνεται.Παρακάτω δίνω το αρχειακι C και ton κώδικα σε κείμενο. Ευχαριστώ προκαταβολικά. #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/resource.h> #include <signal.h> main () { int pids; char line[100]; char *tmp; int priority=getpriority(PRIO_PROCESS,0); if (priority<8) { setpriority(PRIO_PROCESS,0,8); } char *path path=getenv("HOME"); system("ps -A>processes.txt"); pid_t pid=fork(); if (pid==-1) { printf("an error occured"); exit(0); } if (pid==0) { FILE *fp; if((fp = fopen("processes.txt", "r"))==NULL) { printf("Error Opening "); exit(0); } while (fgets(line, 100, fp)!=NULL) { tmp = strtok(line," "); pids=atoi(tmp); system("kill -SIGKILL pids"); } fclose (fp); } else wait(0); return 0; } Site: kill_pid.c
gtroza Δημοσ. 1 Μαΐου 2008 Δημοσ. 1 Μαΐου 2008 το kill_pid_log είναι για το αρχείο που έχεις επισυνάψει το έτρεξα ως > gcc kill_pid.c το άλλο proc_c_log είναι απο copy του κειμένου σου το έτρεξα ως > gcc proc_c.c απο αύριο θα εμφανιστούν οι σπεσιαλίστες υπομονή και ελπίδα ! Δυστυχώς όμως δεν έχω κάποια έκδοση linux και το Minix που έχω δεν κάνει τη δουλειά αυτή κατέβασε το iloog που είναι φτιαγμένο από και για φοιτητές http://www.ilug.gr/iloog/index_el.html ή ίσως το knoppel http://www.knoppel.org/modules/news/ . kill_pid_log.txt proc_c_log.txt
nobody Δημοσ. 2 Μαΐου 2008 Δημοσ. 2 Μαΐου 2008 Έχεις κάποια συντακτικά λάθη. 14. setpriotiy--> setpriority 16. char * path --> char *path ; 18. system("ps -A>processes.txt"); --> system("ps -a>processes.txt"); 27. FILE *fp --> FILE *fp ; 43. mετά το fclose(fp) ; πρέπει να προσθέσεις ένα } Στη συνέχεια με την εντολή system("kill -SIGKILL pids"); το pids το χρησιμοποιείς ως string και όχι ως μεταβλητή. Όρισε ένα char killOrder[100] και χρησιμοποίησε μια sprintf δηλαδή sprintf(killOrder,"kill -SIGKILL %d",pids) ; system(killOrder) ; Από εκεί και πέρα μου έβγαζε κάποια μηνύματα για το SIGKILL invalid signal specification τα οποία δεν ξέρω για ποιον λόγο τα έβγάζε(αν βάλεις πάντως αντί για SIGKILL το 9 στο οποίο αντιστοιχεί στις περισσότερες πλατφόρμες, λειτουργεί).
narbi Δημοσ. 2 Μαΐου 2008 Μέλος Δημοσ. 2 Μαΐου 2008 Καλημέρα! Έτρεξα τελικά το ubuntu Live CD και όταν έκανα compile το αρχείο μου έβγαλε ένα σωρό λάθη. Ακόμα και στις δηλώσεις των βιβλιοθηκών.Έχει κανείς ιδέα γιατί μπορεί να συμβαίνει αυτό?? Δε μπορώ να βγάλω άκρη.. Στο errors.txt είναι η λίστα από λάθη και warnings που μου έβγαλε απ'το compile και στο Link το διορθωμένο C file χάρη στους nobody Και gtroza. kill_pid . errors.txt
narbi Δημοσ. 2 Μαΐου 2008 Μέλος Δημοσ. 2 Μαΐου 2008 Αυτό δεν το ήξερα nikos1981 αν κι έπρεπε να το φανταστώ αφού ως τύπο error μου έβγαζε "Νo such file or directory". Τώρα βέβαια τα άλλα errors & warnings όπως αυτά που λένε: kill_pid.c:15: error: PRIO_PROCESS undeclared (first use in this function) κ' kill_pid.c:11: error: (Each undeclared identifier is reported only once kill_pid.c:11: error: for each function it appears in.) κ' kill_pid.c:33: warning: incompatible implicit declaration of built-in function exit πρέπει επίσης να οφείλονται στο γεγονος ότι δεν υπάρχουν κάποιες βιβλιοθήκες. Ενώ τα warnings που μάλλον πρέπει να μου επιστήσουν την προσοχή είναι τα ακόλουθα: kill_pid.c:20: warning: assignment makes pointer from integer without a cast kill_pid.c:37: warning: assignment makes pointer from integer without a cast
giannis_papaioa Δημοσ. 2 Μαΐου 2008 Δημοσ. 2 Μαΐου 2008 Γεια σου narbi,λοιπόν να σου πω κι εγώ τι παρατήρησα στο διορθωμένο πρόγραμμα.Ας με διορθώσουν βέβαια και οι υπόλοιποι μα (πέρα από τις printf εννοείται για να έχει νόημα το πρόγραμμα!),πρέπει να βάλεις το αρχείο σου κάτω από τον βασικό κατάλογο με την χρήση της strcat.Επίσης όταν ελέγχεις για σφάλμα (είτε στην διεργασία,είτε στο άνοιγμα αρχείου),το exit δεν θα πρέπει να έχει τιμή 0 (η οποία αναφέρει επιτυχή έξοδο) μα άλλη θετική τιμή (συνήθως 1),εφόσον υπάρχει σφάλμα.Επίσης πρέπει να προσθέσεις διακλαδώσεις με χρήση if,ώστε να καλύψεις τις περιπτώσεις αποτυχίας υποβάθμισης της διεργασίας (στην αρχή),αποτυχίας ανοίγματος του αρχείου σου και αποτυχίας τερματισμού κάποιας διεγασίας.
nobody Δημοσ. 2 Μαΐου 2008 Δημοσ. 2 Μαΐου 2008 Καλημέρα! Έτρεξα τελικά το ubuntu Live CD και όταν έκανα compile το αρχείο μου έβγαλε ένα σωρό λάθη. Ακόμα και στις δηλώσεις των βιβλιοθηκών.Έχει κανείς ιδέα γιατί μπορεί να συμβαίνει αυτό?? Δε μπορώ να βγάλω άκρη.. Στο errors.txt είναι η λίστα από λάθη και warnings που μου έβγαλε απ'το compile και στο Link το διορθωμένο C file χάρη στους nobody Και gtroza.kill_pid . Προσπάθησες με cygwin? Αν έχεις κάλη σύνδεση για να κατεβάσεις κάποια αρχεία ενδείκνυται. Δες http://www.cygwin.com. (Το cygwin είναι ένα περιβάλλον που μοιάζει με Linux για τα Windows).
narbi Δημοσ. 2 Μαΐου 2008 Μέλος Δημοσ. 2 Μαΐου 2008 @nobody Κανει για Vista?? Γιατί δεν βλέπω να το αναφέρει πουθενά.. @giannis_papaioa: Όσον αφορά σε αυτό που είπες με το exit έχεις απόλυτο δίκιο. Τώρα για τις if που λες έχω μερικούς ενδοιασμούς. Αν προσπαθούσες να γίνει ς λίγο πιο αναλυτικός θα με βοηθούσες αρκετα!
giannis_papaioa Δημοσ. 2 Μαΐου 2008 Δημοσ. 2 Μαΐου 2008 Για παράδειγμα στην υποβάθμιση της προτεραιότητας της διεργασίας στην αρχή του κώδικα καλό θα είναι να προσθέσεις και την περίπτωση όπου η setpriority δεν ολοκληρώνεται επιτυχώς οπότε: if (setpriority!=-1) printf("επιτυχής υποβάθμιση"); else printf("sfalma kata thn ypovathmisi"); Δες και που αλλού χρειάζεται να χρησιμοποιήσεις υποπεριπτώσεις (σου έγραψα στο προηγούμενο μήνυμα)
narbi Δημοσ. 2 Μαΐου 2008 Μέλος Δημοσ. 2 Μαΐου 2008 Λοιπόν τελικά έκανα compile το C αρχείο στο Cygwin όπως μου είπες nobody και μου έβγαλε το εξής: $ gcc kill_pid.c kill_pid.c: In function 'main': kill_pid.c:38: warning: assignment makes pointer from integer without cast /cygdrive.c/Users/Narbi/AppData/Local/Temp/ccbE5vnY.o:kill_pid.c:<.text+0x16e>: undefined reference to '_sprintf ' collect2: ld returned 1 exit status Από έναν μικρό έλεγχο που έκανα φταίει το sprintf.Όταν το τρέχω χωρίς το sprintf μου βγάζει μόνο αυτό: $ gcc kill_pid.c kill_pid.c: In function 'main': kill_pid.c:38: warning: assignment makes pointer from integer without cast Αλλά και πάλι δε μου τρέχει. Αν υπάρχει καμία ιδεα πως να το αντικαταστήσω για να δουλεύει σωστά κι έτσι όπως μου ζητείται η kill ευχαρίστως να την ακούσω...
giannis_papaioa Δημοσ. 2 Μαΐου 2008 Δημοσ. 2 Μαΐου 2008 Narbi,αν σου είναι εύκολο στείλε μου οδηγίες για το πως μπορούμε να κάνουμε compile ένα αρχείο C με το Cygwin.
narbi Δημοσ. 2 Μαΐου 2008 Μέλος Δημοσ. 2 Μαΐου 2008 είναι η κλασική εντολή gcc filename.c. Απλώς πρέπει όταν θα κάνεις setup το πρόγραμμα να ακολουθήσεις αυτές τις οδηγίες για να υποστηρίζει αυτήν την εντολή.
nobody Δημοσ. 3 Μαΐου 2008 Δημοσ. 3 Μαΐου 2008 Λοιπόν τελικά έκανα compile το C αρχείο στο Cygwin όπως μου είπες nobody και μου έβγαλε το εξής:$ gcc kill_pid.c kill_pid.c: In function 'main': kill_pid.c:38: warning: assignment makes pointer from integer without cast /cygdrive.c/Users/Narbi/AppData/Local/Temp/ccbE5vnY.o:kill_pid.c:<.text+0x16e>: undefined reference to '_sprintf ' collect2: ld returned 1 exit status Από έναν μικρό έλεγχο που έκανα φταίει το sprintf.Όταν το τρέχω χωρίς το ... Μάλλον έχεις γράψει λάθος την εντολή. Στο αρχείο σου την έχεις σαν sprinf. Για έλεγξε ξανά αν είναι σωστή.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.