### 31.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;
      }