2

What is the formula used to produce a key that ftok() produces? ftok is a Linux function for creating keys for SYSTEM V IPC.

5
  • 1
    Read ftok manual page. Commented Feb 2, 2019 at 11:58
  • 3
    1. Wouldn't that depend on which libc you're using? 2. Why do you care? Commented Feb 2, 2019 at 12:00
  • On Linux, most implementations of libc are free software. So study the source code of the particular libc you are using, probably glibc ore perhaps musl-libc Commented Feb 2, 2019 at 12:02
  • 1
    ftok() is not Linux-specific. It is a standard part of the SysV IPC suite. Commented Feb 2, 2019 at 13:24
  • ftok is a Linux function for creating keys for SYSTEM V IPC. And a horrible one at that. Picking a random number and hoping it's unique, with no information on already-used keys on the system, is worse than picking a random number yourself. At least you can actually collect information on what keys are already in use. Commented Feb 2, 2019 at 15:22

2 Answers 2

5

In ftok from glibc 2.29:

key_t
ftok (const char *pathname, int proj_id)
{
  struct stat64 st;
  key_t key;

  if (__xstat64 (_STAT_VER, pathname, &st) < 0)
    return (key_t) -1;

  key = ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16)
     | ((proj_id & 0xff) << 24));

  return key;
}

I.e. it's creating a 32-bit key_t by taking the upper 8 bits from the lower 8 bits of proj_id, the second upper 8 bits from the lower 8 bits of the device number of the provided pathname, and the lower 16 bits from the lower 16 bits of the inode number of the provided pathname.

musl libc uses the same algorithm:

key_t ftok(const char *path, int id)
{
    struct stat st;
    if (stat(path, &st) < 0) return -1;

    return ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16) | ((id & 0xffu) << 24));
}
Sign up to request clarification or add additional context in comments.

Comments

0

The ftok() source code in glibc library is :

#include <sys/ipc.h>
#include <sys/stat.h>
key_t
ftok (const char *pathname, int proj_id)
{
  struct stat64 st;
  key_t key;
  if (__xstat64 (_STAT_VER, pathname, &st) < 0)
    return (key_t) -1;
  key = ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16)
         | ((proj_id & 0xff) << 24));
  return key;
}

Other functions are available here too.

2 Comments

What's the point of this answer? It just repeats what's in my answer (which is older by an hour) and links to a third-party site instead of the official glibc code repository.
I agree with melpomene. Please don't waste time bytes and internet band for useless things.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.