antonios88 Δημοσ. 20 Μαρτίου 2011 Δημοσ. 20 Μαρτίου 2011 Καλησπέρα σας! εχω μια εργασια να κανω με διεργασιες,pipes κλπ... ολα μια χαρα αλλα..!! η ασκηση σε καποιο σημειο ζηταει να αποθηκευονται τα αποτελεσματα της εντολης "ps -A" σε ενα αρχειο...και θα πρεπει αλλη διεργασια να "διαβαζει" το αρχειο και να αποθηκευει τις PID ΜΟΝΟ σε εναν πινακα (για να μπορω να κανω ταξινομηση μετα)... > PID TTY TIME CMD 1 ? 00:00:01 init 2 ? 00:00:00 kthreadd 3 ? 00:00:00 migration/0 4 ? 00:00:00 ksoftirqd/0 οποτε εχω τα παραπανω αποτελεσματα και θελω κατα την αναγνωση να αποθηκευω ΜΟΝΟ τα PID σε εναν πινακα οπως ξαναειπα... παλιοτερα που ειχα παρομοια ασκηση αλλα με την εντολη "ls -l" ειχα χρησιμοποιησει fgetc αλλα ειχα προβλημα αν υπηρχαν στα ονοματα των αρχειο κενα... ...ειχα στο αρχειο απο την εντολη "ls -l": >total 166804 drwxr-xr-x 4 antonis antonis 4096 2010-05-29 17:26 ask -rw-rw-rw- 1 antonis antonis 5481 2009-05-25 14:41 ask122.c~ drwx------ 3 antonis antonis 4096 2010-05-09 23:11 ask2 -rw-r--r-- 1 antonis antonis 2292 2011-03-19 01:05 askk1 (copy).c o κωδικας μου τοτε ηταν περιπλοκος και επιρρεπης σε λαθη...επρεπε να αποθηκευει αλλου τα ονοματα των αρχειων και αλλου των φακελων...ετσι απο την καθε γραμμη "διαβαζα" το πρωτο γραμμα και αναλογως αν ηταν "d" ή "-" αποθηκευα τα ονοματα τους εκει που επρεπε ΑΛΛΑ...αν το ονομα ειχε κενο μεσα μου χαλαγε την σωστη αποθηκευση του ονοματος και την αναγνωση της επομενης γραμμης και γινοταν χαμος!!! Στην τωρινη μου ασκηση τι αλλο μπορω να χρησιμοποιησω εκτος απο fgetc ωστε να διαβαζω και να αποθηκευω μονο την στηλη των PID?? (τα PID τα χρειαζομαι πρωτον για ταξινομηση(με βαση την προτεραιοτητα τους ομως) και 2ον για να βρισκω την προτεραιοτητα οποιας διεργασιας θελω,οποτε χρειαζομαι μονο τον αριθμο για να τον μετατρεψω σε integer...) τι προτεινετε στην περιπτωση μου? εχω χρησιμοποιησει ως τωρα "fscanf",fgetc,getc,(μια εντολη που διαβαζει γραμμη-γραμμη απο αρχειο,αν μπορειτε πειτε μου πως την λενε γιατι εχω κολλησει(Edit: νομιζω ειναι η "fgets"))...τι αλλο μπορω να κανω για να απλοποιησω τον κωδικα μου? ευχαριστω πολυ και συγνωμη αν κουρασα...οποιος μπορει ας μου απαντησει!!
Directx Δημοσ. 20 Μαρτίου 2011 Δημοσ. 20 Μαρτίου 2011 Θα μπορούσες να λύσεις το ζήτημα (κλασσικά) με την χρήση της fgets για να διαβάζεις άνετα το αρχείο γραμμή προς γραμμή και ύστερα να διαβάζεις την τιμή κάθε PID με την βοήθεια της sscanf (πιο σίγουρη - στιβαρή από μια fscanf) στο buffer που σου επιστρέφει η fgets, δίχως άλλη εμπλοκή (πχ. fgetc κτλ). Υ.Γ. Ο τίτλος του θέματος δεν είναι σωστός, ζητάς κώδικα C# αλλά από τα συμφραζόμενα σου μάλλον θες C -σωστά;
antonios88 Δημοσ. 20 Μαρτίου 2011 Μέλος Δημοσ. 20 Μαρτίου 2011 φιλε μου εχεις δικιο για "c" μιλαω... ναι το σκεφτηκα αυτο με την "fgets" γιατι σε αυτην την ασκηση με βολευει,απλα σκεφτομαι οτι μετα το ιδιο πραγμα πρεπει να κανω.... την "sscanf" δεν την ξερω!!θα ψαξω στο ιντερνετ και θα την χρησιμοποιησω αμα ειναι καλυτερη.... δε ξερω αν υπαρχει,ρωταω,αν υπαρχει καποια συναρτηση που να διαβαζει απο αρχειο και να σταματαει μολις βρει κενο....στην ουσια να διαβαζει λεξη-λεξη...ουσιαστικα στο προβλημα μου αυτο πρεπει να κανω εγω απλα μηπως υπαρχει καμια ετοιμη συναρτηση που δεν ξερω.....
παπι Δημοσ. 20 Μαρτίου 2011 Δημοσ. 20 Μαρτίου 2011 φιλε μου εχεις δικιο για "c" μιλαω... ναι το σκεφτηκα αυτο με την "fgets" γιατι σε αυτην την ασκηση με βολευει,απλα σκεφτομαι οτι μετα το ιδιο πραγμα πρεπει να κανω.... την "sscanf" δεν την ξερω!!θα ψαξω στο ιντερνετ και θα την χρησιμοποιησω αμα ειναι καλυτερη.... δε ξερω αν υπαρχει,ρωταω,αν υπαρχει καποια συναρτηση που να διαβαζει απο αρχειο και να σταματαει μολις βρει κενο....στην ουσια να διαβαζει λεξη-λεξη...ουσιαστικα στο προβλημα μου αυτο πρεπει να κανω εγω απλα μηπως υπαρχει καμια ετοιμη συναρτηση που δεν ξερω..... Για λεξη λεξη βαζεις στη xscanf "%[^ ]s" edit: μετα το ^ βαζεις κενο
antonios88 Δημοσ. 20 Μαρτίου 2011 Μέλος Δημοσ. 20 Μαρτίου 2011 σε λιγο μπαινω ubuntu να το δοκιμασω....ελπιζω να μου κανει στον κωδικα μου....αμα κολλησω καπου θα σας πω! υπερ-ευχαριστω!!!!
antonios88 Δημοσ. 21 Μαρτίου 2011 Μέλος Δημοσ. 21 Μαρτίου 2011 παιδια σε συνδιασμο της "fgets" και της "sscanf" (οπου ανακαλυψα καποια "μυστικα" που εχει,απο το ιντερνετ) το προγραμμα μου εχει γινει σχεδον τελειο!!εχω κολλησει μονο στον "επιλογο"...πιστευω μεχρι αυριο να το εχω βρει αλλα οποιος μπορει να βοηθησει(περισσοτερα μυαλα ειναι καλυτερα απο ενα και οι περισσοτεροι εχετε μεγαλυτερη πειρα απο μενα) λοιπον,το προγραμμα μου χρησιμοποιει 2 pipes...το 1ο απο την διεργασια πατερα --> παιδι,οπου μεταφερει απλα ενα string που εισαγαμε απο το πληκτρολογιο και το 2ο pipe απο την διεργασια παιδι -->πατερα ,οπου θελω να μεταφερω ολοκληρο πινακα ακεραιων.... η πρωτη μου σκεψη ηταν αυτη (ειναι και περασμενη η ωρα ): >if (write(pipe2[1],array , strlen(array))!=strlen(array)){ printf("write error\n");} δηλαδη ελπιζα μηπως μεταφερει κατευθειαν ολο τον πινακα αλλα δεν εγινε...2η σκεψη ειναι να χρησιμοποιησω βροχο αλλα δε 8α πρεπει να χρησιμοποιησω αντιστοιχο βροχο και στην διεργασια πατερα αποθηκευοντας καθε φορα την καθε τιμη σε εναν αλλο πινακα array2?? εν συντομια πως το σκεφτομαι: ο κωδικας στην διεργασια παιδι: >for(i=k;i>=0;i--){ if (write(pipe2[1],array[i] , strlen(array[i]))!=strlen(array[i])){ printf("write error\n");} ο κωδικας στην διεργασια πατερα: >for(i=k;i>=0;i--){ if (read(pipe2[0],array2[i] , strlen(array2[i]))!=strlen(array2[i])){ printf("write error\n");} αλλα 1ο προβλημα που σκεφτηκα οτι υπαρχει ειναι πως το μεγεθος του πινακα στην διεργασια-παιδι ειναι μεταβλητο ("κ" το εχω βαλει εδω)...οποτε η διεργασια-πατερα πως θα ξερει το μεγεθος?παλι μεσω pipe? θα κανω δοκιμες,οποιος μπορει ας βοηθησει...ευχαριστω!! Edit:...λοιπον μετα απο μιαμιση ωρα προσπαθειων καταλαβα οτι ειναι πιο δυσκολο απο οσο νομιζα...ξεχαστε τα αποπανω,δεν ισχυουν....τα δοκιμασα!! το προβλημα ειναι το εξης: εχω 2 πινακες ακεραιων στην διεργασια-παιδι και θελω να τα μεταφερω μεσω pipe στην διεργασια-πατερα...οποιος εχει προτασεις ας τις ριξει στο τραπεζι!!! παω για υπνο...
panossubs7 Δημοσ. 21 Μαρτίου 2011 Δημοσ. 21 Μαρτίου 2011 Μάλλον εχουμε την ίδια εργασία... και εγω κολλαω στο ιδιο σημείο!Η getpriority() μαλλον λυνει το προβλημα αλλα πως τη χρησιμοποιείς για ολες τις διεργασίες
antonios88 Δημοσ. 21 Μαρτίου 2011 Μέλος Δημοσ. 21 Μαρτίου 2011 ...Πρεπει καταρχην να βρεις τα PID's ολων των τρεχοντων διεργασιων...(η εντολη ειναι "ps -A") εγω τα αποθηκευσα σε εναν πινακα και μετα ειναι πολυ ευκολο με μια getpriority() οπως λες να βρεις και την προτεραιοτητα της καθεμιας..!! το θεμα ειναι πως αυτους τους 2 πινακες θα τους "στειλω" στην διεργασια-πατερα..?? επισης για να καταλαβω πως δουλευουν τα pipes... ας υποθεσουμε πως οι διεργασιες τρεχουν ταυτοχρονα...μεχρι να τελειωσει η διεργασια-παιδι αυτα που εχει να κανει, η πατρικη πρεπει να "περιμενει" ( wait() ) για να λαβει τα δεδομενα που χρειαζεται... αρα το read(pipe).. θα παει πριν την wait() ή μετα?
panossubs7 Δημοσ. 21 Μαρτίου 2011 Δημοσ. 21 Μαρτίου 2011 ας υποθεσουμε πως οι διεργασιες τρεχουν ταυτοχρονα...μεχρι να τελειωσει η διεργασια-παιδι αυτα που εχει να κανει, η πατρικη πρεπει να "περιμενει" ( wait() ) για να λαβει τα δεδομενα που χρειαζεται... αρα το read(pipe).. θα παει πριν την wait() ή μετα? χωρίς να είμαι σιγουρος(ετσι οπως το εχω κανει εγω...)το read παει μετα το wait(). Μπορεις να με βοηθήσεις για την getpriority()?Ολα οκ μεχρι το (ps -A>filename) αλλα μετα δεν μπορω να το βρω με τιποτα!!!
antonios88 Δημοσ. 21 Μαρτίου 2011 Μέλος Δημοσ. 21 Μαρτίου 2011 Λοιπον τα δεδομενα στο αρχειο που δημιουργησες ειναι αυτης της μορφης... > PID TTY TIME CMD 1 ? 00:00:01 init 2 ? 00:00:00 kthreadd 3 ? 00:00:00 migration/0 4 ? 00:00:00 ksoftirqd/0 ...εσυ απο το αρχειο αυτο που θες ειναι την στηλη με τα PID. για να το καταφερεις αυτο πρεπει να "διαβασεις" το αρχειο με τετοιο τροπο ωστε να αποθηκευεις καπου μονο τα PID. οπως λεω πιο πανω εγω χρησιμοποιησα συνδιασμους fgetc,fgets,sscanf...τα δεδομενα τα αποθηκευσα κατευθειαν σε ενα πινακα ακεραιων...απο κει και περα εφοσον εχεις τα PID στην διαθεση σου εχεις κανει την μιση εργασια... το αλλο δυσκολο της υποθεσης ειναι εκει που εχω κολλησει εγω...
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.