pbp Δημοσ. 5 Νοεμβρίου 2012 Δημοσ. 5 Νοεμβρίου 2012 Καλησπέρα σας, αν γνωρίζω τo pid μιας διεργασίας, πως μπορώ να δω αν η συγκεκριμένη διεργασία έχει τερματίσει ή όχι ? Ευχαριστώ. *Για γλώσσα C μιλάω πάντα.
ipduh Δημοσ. 5 Νοεμβρίου 2012 Δημοσ. 5 Νοεμβρίου 2012 έτσι οπως το πας θα μπλέξεις για να ελέγξεις-νταντεύσεις μια process απο μια άλλη κοίτα fork()
pbp Δημοσ. 5 Νοεμβρίου 2012 Μέλος Δημοσ. 5 Νοεμβρίου 2012 έτσι οπως το πας θα μπλέξεις για να ελέγξεις-νταντεύσεις μια process απο μια άλλη κοίτα fork() Νο. έχω δει fork. Εγώ θέλω απλά να ξέρω αν μία διεργασία έχει τερματίσει. Δηλαδή, αν ας πούμε καλέσω τη Sleep για 100 secs και έστω ότι η Sleep είναι background διεργασία, θέλω να μπορέσω να ενημερωθώ με κάποιον τρόπο ότι η διεργασία αυτή έχει τερματίσει.
firewalker Δημοσ. 5 Νοεμβρίου 2012 Δημοσ. 5 Νοεμβρίου 2012 Αν δεν είναι στο proccess table, έχει τερματίσει.
ipduh Δημοσ. 5 Νοεμβρίου 2012 Δημοσ. 5 Νοεμβρίου 2012 (επεξεργασμένο) κανε την να γράψει το PID και το status της σε ένα αρχειο και έλεγξε το αρχείο για να ξεμπερδευεις αλλιώς fork() αλλιως POSIX threads ... μην προσπαθήσεις να το βρεις σε ενα ps με system εκτός και εάν γράφεις κάτι πολύ πρόχειρο ... Επεξ/σία 7 Νοεμβρίου 2012 από ipduh
defacer Δημοσ. 5 Νοεμβρίου 2012 Δημοσ. 5 Νοεμβρίου 2012 Εν συντομία: fork και waitpid με option WNOHANG για να μη μπλοκάρει. Αν επιστρέψει > 0 τότε η child process τερμάτισε. Έχε υπόψη ότι θεωρητικά μπορεί ένα process να έχει τερματίσει κι ένα άλλο να έχει ξεκινήσει με το ίδιο pid. Οπότε μια αφελής προσέγγιση "για να πάρω μια λίστα με τα pid να δω αν υπάρχει ακόμα" θα δουλέψει σωστά μέχρι να έρθει μια στραβή μέρα και να σκάσει. 1
pbp Δημοσ. 5 Νοεμβρίου 2012 Μέλος Δημοσ. 5 Νοεμβρίου 2012 Αν δεν είναι στο proccess table, έχει τερματίσει. και πως ελέγχω τι υπάρχει στο process table? Εν συντομία: fork και waitpid με option WNOHANG για να μη μπλοκάρει. Αν επιστρέψει > 0 τότε η child process τερμάτισε. Έχε υπόψη ότι θεωρητικά μπορεί ένα process να έχει τερματίσει κι ένα άλλο να έχει ξεκινήσει με το ίδιο pid. Οπότε μια αφελής προσέγγιση "για να πάρω μια λίστα με τα pid να δω αν υπάρχει ακόμα" θα δουλέψει σωστά μέχρι να έρθει μια στραβή μέρα και να σκάσει. οκ και αυτό το έχω καταλάβει, αλλά δες λίγο το παράδειγμα με το sleep που λέω πιο πάνω. Δεν θέλω να ελέγξω μόνο στιγμιαία (όταν καλείται η waitpid()) αν έχει τερματίσει η διεργασία, αλλά κάθε στιγμή. Εγώ είχα στο μυαλό μου ας πούμε να κρατάω όλες τις background διεργασίες σε ένα table και κάθε φορά που κάνω κάτι στο πρόγραμμα μου, να ελέγχω αν κάποια από αυτές τις διεργασίες έχει τερματίσει.
defacer Δημοσ. 5 Νοεμβρίου 2012 Δημοσ. 5 Νοεμβρίου 2012 Μπορείς να το κάνεις και αυτό, αλλά τότε θα πρέπει να μιλάμε για multithreaded πρόγραμμα. Το βασικό σου thread ξεκινάει ένα δεύτερο και το δεύτερο κάνει block περιμένοντας κάποιο child process να τερματίσει. Εντωμεταξύ το βασικό σου thread συνεχίζει κανονικά, και όταν το δεύτερο ξανατρέξει τα κανονίζεις όπως θέλεις. Σε περίπτωση που το πρόγραμμα είναι console app και το βασικό thread δεν έχει τίποτα να κάνει όσο περιμένεις τότε μπορείς να μη μπλεχτείς καν με δεύτερο. Και στα δύο αυτά σενάρια απλώς δε θα βάλεις WNOHANG οπότε θα κάνεις block μέχρι να τερματίσει το fork. Σκέψου το όμως λίγο παραπάνω αυτό που είπες πριν. Θέλεις να ελέγξεις αν τερμάτισε το child "κάθε στιγμή". Τι σημαίνει αυτό; Αν δηλαδή το πρόγραμμά σου είναι στη μέση της κλήσης μιας malloc σ' ενδιαφέρει να τα παρατήσεις επιτόπου και να ασχοληθείς με το child που τερμάτισε; Μάλλον όχι. Γενικά ένα οποιοδήποτε πρόγραμμα που περιμένει ένα οποιοδήποτε event να συμβεί πρέπει να είναι φτιαγμένο έτσι που όταν το event συμβεί και ξεκινήσεις να κάνεις κάτι σαν απάντηση, αυτό το κάτι κι αυτό που έκανες πιο πριν (όσο περίμενες) θα πρέπει να μη μπλεχτούν μεταξύ τους. Γι' αυτό το λόγο είτε θα πρέπει να φροντίσεις να ασχοληθείς με το event σε κάποια στιγμή της δικής σου επιλογής, όταν ξέρεις ποιά είναι η κατάσταση του προγράμματός σου και άρα ξέρεις τι είναι ασφαλές να κάνεις και τι όχι, είτε θα πρέπει μόλις ενημερωθείς για το event να χρησιμοποιήσεις κάποιο sync primitive (π.χ. mutex) για να συγχρονιστείς με τα άλλα threads. To πρώτο σενάριο είναι αυτό που έγραψα στο παραπάνω post, το δεύτερο σενάριο είναι αυτό με τα δυο threads. Απλουστεύω λίγο τα πράγματα (γιατί υπάρχουν κι άλλες περιπτώσεις αν τις ψάξεις) αλλά μέσες άκρες αυτή είναι η ιδέα που πρέπει να έχεις στο μυαλό σου: ασφαλής προγραμματισμός και "τα θέλω όλα επιτόπου" δεν συμβιβάζονται μόνα τους, πρέπει εσύ να τα συμβιβάσεις.
ipduh Δημοσ. 5 Νοεμβρίου 2012 Δημοσ. 5 Νοεμβρίου 2012 pbp , φαντάσου το οτι περιμένει όλην την ώρα συνεχομένα ( δεν - αλλα φαντάσου το ) μην ιδρώνεις τις λεπτομερειες ... αυτά που κάνει το λειτουργικό ουτε ο linus δεν τα θυμάται εσύ μάθε πως να χρησιμοποιείς fork ή POSIX threads ή το κόλπάκι με τα αρχεία που σου είπα εάν γράφεις κάτι πρόχειρο και δεν χρειάζεται να 'ναι όλο C έχω γράψει μιας γενικής χρησης νταντα σε perl που θα μπορούσα να σου δώσω ...
migf1 Δημοσ. 6 Νοεμβρίου 2012 Δημοσ. 6 Νοεμβρίου 2012 (επεξεργασμένο) Καλησπέρα σας, αν γνωρίζω τo pid μιας διεργασίας, πως μπορώ να δω αν η συγκεκριμένη διεργασία έχει τερματίσει ή όχι ? Ευχαριστώ. *Για γλώσσα C μιλάω πάντα. Εφόσον είσαι σίγουρος πως γνωρίζεις το pid, μπορείς να στείλεις το system-call kill() με sig=0. Αν σου επιστρέψει -1 και το errno ισούται με ESRCH η διεργασία σου δεν βρέθηκε (άρα έχει τερματίσει)... > ... #include <errno.h> #include <signal.h> ... bool proc_is_valid( pid_t pid ) { errno = 0; kill(pid, 0); return (ESRCH != errno); } Το παραπάνω με την προϋπόθεση πως έχεις permissions να στέλνεις signals σε άλλα processes. Αλλιώς θα πρέπει να ελέγχεις στην συνάρτησή σου και την περίπτωση κατά την οποία αποτυγχάνει η kill() και το errno ισούται με EPERM. EDIT: Αλλαγή στη σειρά συνθηκών της return. EDIT-2: Επειδή την είχα κάνει μαντάρα, ξανάγραψα την συνάρτηση (ελπίζω να είναι οκ τώρα). Επεξ/σία 6 Νοεμβρίου 2012 από migf1
ipduh Δημοσ. 7 Νοεμβρίου 2012 Δημοσ. 7 Νοεμβρίου 2012 (επεξεργασμένο) για δυό προγράμματα: κάνε το ένα να γράψει το PID του ( και το STATUS ) του σε ένα αρχείο απο το δευτερο διάβασε το PID του πρώτου και το STATUS του και κάνε και κατι σαν αυτό που λέει ο migf1 για να διπλοελέγξεις --και πάλι αυτό ειναι προχειρο-- δηλαδή κάτι σαν > # ~/test$ ps aufx | tail -1 user 22931 0.0 0.1 200260 15128 ? S Nov05 0:04 gcalctool # ~/test$ kill -0 22931 # ~/test$ echo $? 0 # ~/test$ ps aufx | tail -1 user 22931 0.0 0.1 200260 15128 ? S Nov05 0:04 gcalctool Αν και κρίνοντας απο αυτό που λές για το sleep , και το άλλο σου θέμα ... νομίζω οτι θες να `νταντευσεις` μια process που σημαίνει fork() ή threads ... Επεξ/σία 7 Νοεμβρίου 2012 από ipduh
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα