Προς το περιεχόμενο

C για linux


narbi

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημέρα σε όλους! Έχω φτιάξει ένα πρόγραμμα σε 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;

}

 

Link.png Site: kill_pid.c

Δημοσ.

το kill_pid_log είναι για το αρχείο που έχεις επισυνάψει

 

το έτρεξα ως > gcc kill_pid.c

 

το άλλο proc_c_log είναι απο copy του κειμένου σου

 

το έτρεξα ως > gcc proc_c.c

 

απο αύριο θα εμφανιστούν οι σπεσιαλίστες

υπομονή και ελπίδα ! :-D

 

Δυστυχώς όμως δεν έχω κάποια έκδοση 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

Δημοσ.

Έχεις κάποια συντακτικά λάθη.

 

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 στο οποίο αντιστοιχεί στις περισσότερες πλατφόρμες, λειτουργεί).

Δημοσ.

Καλημέρα! Έτρεξα τελικά το ubuntu Live CD και όταν έκανα compile το αρχείο μου έβγαλε ένα σωρό λάθη. Ακόμα και στις δηλώσεις των βιβλιοθηκών.Έχει κανείς ιδέα γιατί μπορεί να συμβαίνει αυτό?? Δε μπορώ να βγάλω άκρη.. Στο errors.txt είναι η λίστα από λάθη και warnings που μου έβγαλε απ'το compile και στο Link το διορθωμένο C file χάρη στους nobody Και gtroza.

kill_pid .

errors.txt

Δημοσ.

Αυτό δεν το ήξερα 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

Δημοσ.

Γεια σου narbi,λοιπόν να σου πω κι εγώ τι παρατήρησα στο διορθωμένο πρόγραμμα.Ας με διορθώσουν βέβαια και οι υπόλοιποι μα (πέρα από τις printf εννοείται για να έχει νόημα το πρόγραμμα!),πρέπει να βάλεις το αρχείο σου κάτω από τον βασικό κατάλογο με την χρήση της strcat.Επίσης όταν ελέγχεις για σφάλμα (είτε στην διεργασία,είτε στο άνοιγμα αρχείου),το exit δεν θα πρέπει να έχει τιμή 0 (η οποία αναφέρει επιτυχή έξοδο) μα άλλη θετική τιμή (συνήθως 1),εφόσον υπάρχει σφάλμα.Επίσης πρέπει να προσθέσεις διακλαδώσεις με χρήση if,ώστε να καλύψεις τις περιπτώσεις αποτυχίας υποβάθμισης της διεργασίας (στην αρχή),αποτυχίας ανοίγματος του αρχείου σου και αποτυχίας τερματισμού κάποιας διεγασίας.

Δημοσ.
Καλημέρα! Έτρεξα τελικά το ubuntu Live CD και όταν έκανα compile το αρχείο μου έβγαλε ένα σωρό λάθη. Ακόμα και στις δηλώσεις των βιβλιοθηκών.Έχει κανείς ιδέα γιατί μπορεί να συμβαίνει αυτό?? Δε μπορώ να βγάλω άκρη.. Στο errors.txt είναι η λίστα από λάθη και warnings που μου έβγαλε απ'το compile και στο Link το διορθωμένο C file χάρη στους nobody Και gtroza.

kill_pid .

 

Προσπάθησες με cygwin? Αν έχεις κάλη σύνδεση για να κατεβάσεις κάποια αρχεία ενδείκνυται. Δες http://www.cygwin.com. (Το cygwin είναι ένα περιβάλλον που μοιάζει με Linux για τα Windows).

Δημοσ.

@nobody Κανει για Vista?? Γιατί δεν βλέπω να το αναφέρει πουθενά..

@giannis_papaioa: Όσον αφορά σε αυτό που είπες με το exit έχεις απόλυτο δίκιο. Τώρα για τις if που λες έχω μερικούς ενδοιασμούς. Αν προσπαθούσες να γίνει ς λίγο πιο αναλυτικός θα με βοηθούσες αρκετα!

Δημοσ.

 

Για παράδειγμα στην υποβάθμιση της προτεραιότητας της διεργασίας στην αρχή του κώδικα καλό θα είναι να προσθέσεις και την περίπτωση όπου η setpriority δεν ολοκληρώνεται επιτυχώς οπότε:

if (setpriority!=-1)

printf("επιτυχής υποβάθμιση");

else

printf("sfalma kata thn ypovathmisi");

Δες και που αλλού χρειάζεται να χρησιμοποιήσεις υποπεριπτώσεις (σου έγραψα στο προηγούμενο μήνυμα)

Δημοσ.

Λοιπόν τελικά έκανα 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 ευχαρίστως να την ακούσω... :)

Δημοσ.

είναι η κλασική εντολή gcc filename.c. Απλώς πρέπει όταν θα κάνεις setup το πρόγραμμα να ακολουθήσεις αυτές τις οδηγίες για να υποστηρίζει αυτήν την εντολή.

Δημοσ.
Λοιπόν τελικά έκανα 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. Για έλεγξε ξανά αν είναι σωστή.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...