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

Linux programming


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

Δημοσ.

Καλησπέρα σας,

αν γνωρίζω τo pid μιας διεργασίας, πως μπορώ να δω αν η συγκεκριμένη διεργασία έχει τερματίσει ή όχι ?

Ευχαριστώ.

 

*Για γλώσσα C μιλάω πάντα.

Δημοσ.

έτσι οπως το πας θα μπλέξεις

για να ελέγξεις-νταντεύσεις μια process απο μια άλλη κοίτα fork()

Νο.

έχω δει fork.

Εγώ θέλω απλά να ξέρω αν μία διεργασία έχει τερματίσει.

Δηλαδή, αν ας πούμε καλέσω τη Sleep για 100 secs και έστω ότι η Sleep είναι background διεργασία, θέλω να μπορέσω να ενημερωθώ με κάποιον τρόπο ότι η διεργασία αυτή έχει τερματίσει.

Δημοσ. (επεξεργασμένο)

κανε την να γράψει το PID και το status της σε ένα αρχειο και έλεγξε το αρχείο

για να ξεμπερδευεις

 

αλλιώς fork()

 

αλλιως POSIX threads

 

... μην προσπαθήσεις να το βρεις σε ενα ps με system

εκτός και εάν γράφεις κάτι πολύ πρόχειρο ...

Επεξ/σία από ipduh
Δημοσ.

Εν συντομία: fork και waitpid με option WNOHANG για να μη μπλοκάρει. Αν επιστρέψει > 0 τότε η child process τερμάτισε.

 

Έχε υπόψη ότι θεωρητικά μπορεί ένα process να έχει τερματίσει κι ένα άλλο να έχει ξεκινήσει με το ίδιο pid. Οπότε μια αφελής προσέγγιση "για να πάρω μια λίστα με τα pid να δω αν υπάρχει ακόμα" θα δουλέψει σωστά μέχρι να έρθει μια στραβή μέρα και να σκάσει.

  • Like 1
Δημοσ.

Αν δεν είναι στο proccess table, έχει τερματίσει.

 

και πως ελέγχω τι υπάρχει στο process table?

 

Εν συντομία: fork και waitpid με option WNOHANG για να μη μπλοκάρει. Αν επιστρέψει > 0 τότε η child process τερμάτισε.

 

Έχε υπόψη ότι θεωρητικά μπορεί ένα process να έχει τερματίσει κι ένα άλλο να έχει ξεκινήσει με το ίδιο pid. Οπότε μια αφελής προσέγγιση "για να πάρω μια λίστα με τα pid να δω αν υπάρχει ακόμα" θα δουλέψει σωστά μέχρι να έρθει μια στραβή μέρα και να σκάσει.

 

οκ και αυτό το έχω καταλάβει,

αλλά δες λίγο το παράδειγμα με το sleep που λέω πιο πάνω.

Δεν θέλω να ελέγξω μόνο στιγμιαία (όταν καλείται η waitpid()) αν έχει τερματίσει η διεργασία, αλλά κάθε στιγμή.

Εγώ είχα στο μυαλό μου ας πούμε να κρατάω όλες τις background διεργασίες σε ένα table και κάθε φορά που κάνω κάτι στο πρόγραμμα μου, να ελέγχω αν κάποια από αυτές τις διεργασίες έχει τερματίσει.

Δημοσ.

Μπορείς να το κάνεις και αυτό, αλλά τότε θα πρέπει να μιλάμε για 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.

 

Απλουστεύω λίγο τα πράγματα (γιατί υπάρχουν κι άλλες περιπτώσεις αν τις ψάξεις) αλλά μέσες άκρες αυτή είναι η ιδέα που πρέπει να έχεις στο μυαλό σου: ασφαλής προγραμματισμός και "τα θέλω όλα επιτόπου" δεν συμβιβάζονται μόνα τους, πρέπει εσύ να τα συμβιβάσεις.

Δημοσ.

pbp ,

 

φαντάσου το οτι περιμένει όλην την ώρα συνεχομένα ( δεν - αλλα φαντάσου το )

μην ιδρώνεις τις λεπτομερειες ... αυτά που κάνει το λειτουργικό ουτε ο linus δεν τα θυμάται

 

εσύ μάθε πως να χρησιμοποιείς fork ή POSIX threads ή το κόλπάκι με τα αρχεία που σου είπα

 

εάν γράφεις κάτι πρόχειρο και δεν χρειάζεται να 'ναι όλο C

έχω γράψει μιας γενικής χρησης νταντα σε perl που θα μπορούσα να σου δώσω ...

Δημοσ. (επεξεργασμένο)

Καλησπέρα σας,

αν γνωρίζω τ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:

 

Επειδή την είχα κάνει μαντάρα, ξανάγραψα την συνάρτηση (ελπίζω να είναι οκ τώρα).

Επεξ/σία από migf1
Δημοσ. (επεξεργασμένο)

για δυό προγράμματα:

 

κάνε το ένα να γράψει το 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 ...

Επεξ/σία από ipduh

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...