Sous-routine proc_setattr
Objectif
Définit les attributs sélectionnés d'un processus.
Bibliothèque
Bibliothèque C standard (libc.a)
Syntaxe
#include <sys/proc.h>
int proc_setattr (pid,attr,size)
pid_t pid;
procattr_t* attr;
size64_t size;Descriptif
Les sous-routines proc_setattr permettent de définir les attributs sélectionnés d'un processus. La liste des attributs sélectionnés est définie dans la structureprocattr_t définie dans le fichier d'en-tête <sys/proc.h> .
typedef struct {
uchar core_naming; /* Unique core file names */
uchar core_mmap; /* Dump nonanonymous mmap regions to core file */
uchar core_shm; /* Dump shared memory to core file */
uchar aixthread_hrt; /* High resolution timer for thread */
}procattr_t; Pour définir les attributs du processus appelant, une adresse -1 peut être transmise comme premier argument, pid.
Le processus A peut définir des attributs de processus pour le processus B si un ou plusieurs des éléments suivants sont vrais:
- Les processus A et B ont le même ID utilisateur réel ou effectif.
- Le processus A a été exécuté par l'utilisateur root.
- Le processus A dispose du privilège PV_DAC_W .
Paramètres
| Article | Descriptif |
|---|---|
| PID | Identificateur du processus dont les informations doivent être extraites. |
| attr | Pointeur vers la structure utilisateur qui va contenir les informations extraites de la structure de noyau de processus. |
| Taille | La structure sizeof procattr_t est stockée dans le paramètre size lors de l'appel de l'API. |
Valeurs renvoyées
| Article | Descriptif |
|---|---|
| 0 % | proc_setattr a abouti. |
| -1 | proc_setattr a échoué. La variable globale errno est définie pour indiquer l'erreur. |
Codes d'erreur
| Article | Descriptif |
|---|---|
| EINVAL | L'argument size ne correspond pas à la taille de procattr_t dans le noyau. |
| EFAULT | La valeur attr transmise à la mémoire tampon n'est pas valide. |
| ESRCH | Impossible de localiser l'identificateur de processus. |
| EPERM | Privilèges insuffisants pour lire les attributs de la structure proc cible. |
Exemple
setprocflags.c
#include <stdio.h>
#include <sys/proc.h>
#define P(_x_) (((_x_) == PA_ENABLE) ? "ENABLE" : \
((_x_) == PA_DISABLE ? "DISABLE" : \
(((_x_) == PA_IGNORE) ? "IGNORE" : "JUNK")))
int main(int argc, char *argv[])
{
int rc;
procattr_t attr;
pid_t pid;
int naming,mmap,shm = 0;
if (argc < ) {
printf("Syntax: %s <pid> <corenaming> <coremmap> <coreshm>\n", argv[0]);
exit(-1);
}
pid = atoi(argv[1]);
bzero(&attr, sizeof(procattr_t));
attr.core_naming = atoi(argv[2]);
attr.core_mmap = atoi(argv[3]);
attr.core_shm = atoi(argv[4]);
rc = proc_setattr(pid, &attr, sizeof(procattr_t));
if (rc)
{
printf("proc_getattr failed, errno %d\n", errno);
exit(-1);
}
bzero(&attr, sizeof(procattr_t));
rc = proc_getattr(pid, &attr, sizeof(procattr_t));
if (rc)
{
printf("proc_getattr failed, errno %d\n", errno);
exit(-1);
}
printf("core_naming %s\n", P(attr.core_naming));
printf("core_mmap %s\n", P(attr.core_mmap));
printf("core_shm %s\n", P(attr.core_shm));
printf("aixthread_hrt %s\n", P(attr.aixthread_hrt));
}
crash64.c
#include <stdio.h>
int main()
{
int *p = (int *)0x100;
pid_t pid = getpid();
printf("My pid is %d\n", getpid());
getchar();
*p = 0x10;
printf("Done\n");
}
# ./crash64 &
[1] 5570566
# My pid is 5570566
PID 5500FC
# ./setcoreflags 5570566 1 1 1
core_naming ENABLE
core_mmap ENABLE
core_shm ENABLE
aixthread_hrt DISABLE
# fg ./crash64
Memory fault(coredump)
# ls core*
core.5570566.11054349