### 29.5 Reading the Persona of a Process

Here are detailed descriptions of the functions for reading the user and group IDs of a process, both real and effective. To use these facilities, you must include the header files `sys/types.h` and `unistd.h`.

— Data Type: uid_t

> This is an integer data type used to represent user IDs. In the GNU C Library, this is an alias for `unsigned int`.

— Data Type: gid_t

> This is an integer data type used to represent group IDs. In the GNU C Library, this is an alias for `unsigned int`.

— Function: uid_t getuid (void)

> Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

> The `getuid` function returns the real user ID of the process.

— Function: gid_t getgid (void)

> Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

> The `getgid` function returns the real group ID of the process.

— Function: uid_t geteuid (void)

> Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

> The `geteuid` function returns the effective user ID of the process.

— Function: gid_t getegid (void)

> Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

> The `getegid` function returns the effective group ID of the process.

— Function: int getgroups (int count, gid_t *groups)

> Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

> The `getgroups` function is used to inquire about the supplementary group IDs of the process. Up to count of these group IDs are stored in the array groups; the return value from the function is the number of group IDs actually stored. If count is smaller than the total number of supplementary group IDs, then `getgroups` returns a value of `-1` and `errno` is set to `EINVAL`.

> If count is zero, then `getgroups` just returns the total number of supplementary group IDs. On systems that do not support supplementary groups, this will always be zero.

> Here's how to use `getgroups` to read all the supplementary group IDs:

>               gid_t *
>               read_all_groups (void)
>               {
>                 int ngroups = getgroups (0, NULL);
>                 gid_t *groups
>                   = (gid_t *) xmalloc (ngroups * sizeof (gid_t));
>                 int val = getgroups (ngroups, groups);
>                 if (val < 0)
>                   {
>                     free (groups);
>                     return NULL;
>                   }
>                 return groups;
>               }