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 &lt; ) { 
                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