Ο πιο portable τρόπος για να γίνει κάτι τέτοιο είναι να κάνει απλά το πρόγραμμα exec τον εαυτό του με άλλο όνομα.
Στη δική μου περίπτωση το exec δε βόλευε για άλλους λόγους, οπότε η μόνη λύση ήταν η κατευθείαν αλλαγή του ονόματος. Τα BSD έχουν γι αυτή τη δουλειά την κλήση συστήματος setproctitle. Στο Linux όμως δεν υπάρχει κάτι τέτοιο.
Τελικά η λύση είναι διττή: αφενός πρέπει να υπερκαλύψεις (overwrite) τα δεδομένα του argv[0], αφετέρου χρειάζεται το prctl system call με παράμετρο PR_SET_TITLE. Στη δική μου περίπτωση δε χρειάστηκε να κάνω "χώρο" για το νέο όνομα αφού ήξερα με βεβαιότητα ότι θα είναι μικρότερο από το παλιό. Αν κάποιος θέλει τη γενική συνάρτηση που δουλεύει για σχεδόν arbitrary καινούργια ονόματα αυτή υπάρχει στον κώδικα του πακέτου util-linux ως "setproctitle".
Η απλή τώρα λύση, σε κώδικα πάει κάπως έτσι:
- #include <stdlib.h>
- #include <string.h>
- #include <sys/prctl.h>
- #define PNAME "sh"
- int main (int argc, char **argv)
- {
- strcpy (argv[0], PNAME);
- prctl (PR_SET_NAME, PNAME, 0, 0, 0);
- /* cpu hog so that we show up in top */
- for (;;) ;
- return 0;
- }
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου