What is the formula used to produce a key that ftok() produces? ftok is a Linux function for creating keys for SYSTEM V IPC.
2 Answers
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));
}
Comments
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
melpomene
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.
linuxfan says Reinstate Monica
I agree with melpomene. Please don't waste time bytes and internet band for useless things.
libcare free software. So study the source code of the particularlibcyou are using, probably glibc ore perhaps musl-libcftok()is not Linux-specific. It is a standard part of the SysV IPC suite.