`
king_tt
  • 浏览: 2232245 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

如何用ftok来产生相关的key_t值

 
阅读更多
在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()函数详解.docx

    Linux 环境编程-ftok() 函数详解 在 Linux 环境编程中,ftok 函数是一个非常重要的函数,它用于生成 IPC ...通过 ftok 函数,我们可以生成一个唯一的 key_t 值,该值可以用于进程间通信,例如 shmget 共享内存的方式。

    linux系统调用之ftok()

    如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0x26010002。 查询文件索引节点号可通过命令: ls -i来查看 nux Programmer's Manual ...

    西安邮电大学Linux高级编程进程间通信.ppt

    创建者可以使用 ftok 函数来生成一个 key 值,该函数将文件路径和一个整数值作为参数,返回一个 key 值。其他进程可以使用相同的文件路径和整数值来生成相同的 key 值,从而获取该 IPC 对象的 ID 值。 Ftok 函数 ...

    常用函数1

    key_t key = ftok(pathname, proj_id); int msgqid = msgget(key, flags); ``` - `key`:由`ftok()`生成的键值。 - `flags`:标志,可以包含`O_CREAT`等。 - **添加消息**: 使用`msgsnd()`函数将消息添加到...

    Shell脚本实现ftok函数

    IPC Key 的时候可以使用任意自己喜欢的 Key ,但为了避免与其他的程序产生定义重复,在 UNIX/Linux 中一般会使用 key_t ftok(const char *path, int id) 函数来生成一个比较唯一的 Key 值。然而,“每个人都讨厌 ...

    linux ipc的简单使用

    `ftok`函数是Linux系统调用中用于生成一个唯一的IPC键(key_t类型),它是基于文件系统路径和项目ID(project ID)来创建的。这个键用于标识特定的IPC资源,如信号量、消息队列或共享内存。`ftok`的基本语法如下: ...

    Linux消息队列实现进程间通信实例详解

    2. **获取key值**:使用`ftok()`函数根据文件路径名和项目ID获取key值。 ```c key_t ftok(const char *pathname, int proj_id); ``` `ftok()`函数的原理是从给定的路径名获取其`stat`结构中的设备号`st_dev`...

    Linux下C语言编程--进程通信、消息管理

    - `shmget(key_t key, size_t size, int shmflg);`:创建或获取共享内存段。 - `shmat(int shmid, void *shmaddr, int shmflg);`:将共享内存段映射到进程地址空间。 - `shmdt(const void *shmaddr);`:将共享内存段...

    liunx中的消息队列学笔记。

    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 ...

    Linux /Unix 共享内存

    1. **ftok()**:这个函数用于生成一个唯一的关键值(key_t),它是基于指定的路径名`pathname`和项目标识符`proj_id`计算出来的。`proj_id`通常是一个1到255之间的ASCII值。这个关键值用于标识共享内存段。在跨主机的...

    linux下的消息队列编程

    使用消息队列需要首先创建一个消息队列,可以使用 msgget 函数来创建。如果创建成功,将返回一个消息队列标识符(msgid)。然后可以使用 msgsnd 函数将消息发送到消息队列中,使用 msgrcv 函数从消息队列中读出消息...

    消息队列通信

    key_t ftok(const char *fname, int id); ``` **示例**: 假设文件的索引节点号为65538 (十六进制为0x010002),ID值为38 (十六进制为0x26),那么最终的键值为0x26010002。 为了确保键值的稳定性,通常的做法是不...

    system 5 和posix

    它通过控制一个整数值来实现对共享资源的访问控制。信号量有两种基本操作:`P`操作(减1)和`V`操作(加1)。 - **创建信号量**: 使用`semget`函数创建信号量集。 ```c int semget(key_t key, int nsems, int semflg)...

    linux消息队列专题编程笔记.docx

    key_t key = ftok("path", 'project_id'); int msqid = msgget(key, IPC_CREAT | 0666); ``` ##### 2. msgctl - 控制消息队列 **功能**:对消息队列执行多种控制操作,如改变权限、获取状态等。 **原型**: ```c ...

    linux中内存共享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 *...

    Linux环境进程间通信 信号灯

    key_t ftok(char *pathname, char proj); ``` - **参数:** - `pathname`: 文件路径名。 - `proj`: 项目ID,用于生成键值。 - **返回值:** - 返回与路径对应的键值。 通过以上内容,我们可以看到Linux环境...

Global site tag (gtag.js) - Google Analytics