在System V中,我们经常用用key_t的值来创建或者打开信号量,共享内存和消息队列。这个在IPC的环境中十分的重要,比如说,服务器创建了一个消息队列,等待 客户机发送请求。那么如何创建或者打开已有的消息队列呢?一般而言,我们对于服务器使用的路径和项目id(proj_id)是已知的,所以客户机可以获取 相同的key来打开 消息队列并进行操作。下面就是ftok的使用原型:
# include <sys/types.h>
# include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
注意:
1)pathname一定要在系统中存在
2)pathname一定是使用进程能够访问的
3)proj_id是一个1-255之间的一个整数值,典型的值是一个ASCII值。
当成功执行的时候,一个key_t值将会被返回,否则-1被返回。我们可以使用errno来确定具体的错误信息(对于errno的相关信息,请参考http://blog.csdn.net/hello_wyq/archive/2006/08/01/1006216.aspx),如果我们很懒惰的话,不妨就使用perror函数来答应对应的出错字符信息。
下面的程序简单的演示和打印如何使用ftok及其对应值
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
int main( void )
{
for ( int i = 1; i < 256; ++ i )
printf( "key = %ul/n", ftok( "/tmp", i ) );
return 0;
}
分享到:
相关推荐
Linux 环境编程-ftok() 函数详解 在 Linux 环境编程中,ftok 函数是一个非常重要的函数,它用于生成 IPC ...通过 ftok 函数,我们可以生成一个唯一的 key_t 值,该值可以用于进程间通信,例如 shmget 共享内存的方式。
如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0x26010002。 查询文件索引节点号可通过命令: ls -i来查看 nux Programmer's Manual ...
创建者可以使用 ftok 函数来生成一个 key 值,该函数将文件路径和一个整数值作为参数,返回一个 key 值。其他进程可以使用相同的文件路径和整数值来生成相同的 key 值,从而获取该 IPC 对象的 ID 值。 Ftok 函数 ...
key_t key = ftok(pathname, proj_id); int msgqid = msgget(key, flags); ``` - `key`:由`ftok()`生成的键值。 - `flags`:标志,可以包含`O_CREAT`等。 - **添加消息**: 使用`msgsnd()`函数将消息添加到...
IPC Key 的时候可以使用任意自己喜欢的 Key ,但为了避免与其他的程序产生定义重复,在 UNIX/Linux 中一般会使用 key_t ftok(const char *path, int id) 函数来生成一个比较唯一的 Key 值。然而,“每个人都讨厌 ...
`ftok`函数是Linux系统调用中用于生成一个唯一的IPC键(key_t类型),它是基于文件系统路径和项目ID(project ID)来创建的。这个键用于标识特定的IPC资源,如信号量、消息队列或共享内存。`ftok`的基本语法如下: ...
2. **获取key值**:使用`ftok()`函数根据文件路径名和项目ID获取key值。 ```c key_t ftok(const char *pathname, int proj_id); ``` `ftok()`函数的原理是从给定的路径名获取其`stat`结构中的设备号`st_dev`...
- `shmget(key_t key, size_t size, int shmflg);`:创建或获取共享内存段。 - `shmat(int shmid, void *shmaddr, int shmflg);`:将共享内存段映射到进程地址空间。 - `shmdt(const void *shmaddr);`:将共享内存段...
key_t key = ftok("msgqueue", 65); int msqid = msgget(key, 0666 | IPC_CREAT); struct msgbuf message; message.mtype = 1; strcpy(message.mtext, "Hello, Message Queue!"); if (msgsnd(msqid, &...
key_t key = ftok("testfile", 65); // 使用ftok函数生成键值 int sem_id = semget(key, 1, IPC_CREAT | 0666); if (sem_id == -1) { perror("semget"); return 1; } // 定义信号量操作结构体 struct ...
1. **ftok()**:这个函数用于生成一个唯一的关键值(key_t),它是基于指定的路径名`pathname`和项目标识符`proj_id`计算出来的。`proj_id`通常是一个1到255之间的ASCII值。这个关键值用于标识共享内存段。在跨主机的...
使用消息队列需要首先创建一个消息队列,可以使用 msgget 函数来创建。如果创建成功,将返回一个消息队列标识符(msgid)。然后可以使用 msgsnd 函数将消息发送到消息队列中,使用 msgrcv 函数从消息队列中读出消息...
key_t ftok(const char *fname, int id); ``` **示例**: 假设文件的索引节点号为65538 (十六进制为0x010002),ID值为38 (十六进制为0x26),那么最终的键值为0x26010002。 为了确保键值的稳定性,通常的做法是不...
它通过控制一个整数值来实现对共享资源的访问控制。信号量有两种基本操作:`P`操作(减1)和`V`操作(加1)。 - **创建信号量**: 使用`semget`函数创建信号量集。 ```c int semget(key_t key, int nsems, int semflg)...
key_t key = ftok("path", 'project_id'); int msqid = msgget(key, IPC_CREAT | 0666); ``` ##### 2. msgctl - 控制消息队列 **功能**:对消息队列执行多种控制操作,如改变权限、获取状态等。 **原型**: ```c ...
key_t key = ftok("example_file", 'A'); // 使用ftok生成key int shmid = shmget(key, sizeof(int), IPC_CREAT | 0644); // 创建共享内存 if (shmid == -1) { perror("shmget failed"); exit(1); } int *...
key_t ftok(char *pathname, char proj); ``` - **参数:** - `pathname`: 文件路径名。 - `proj`: 项目ID,用于生成键值。 - **返回值:** - 返回与路径对应的键值。 通过以上内容,我们可以看到Linux环境...