标签: ftok

我应该传递哪个文件作为ftok()的路径名参数

它在ftok()手册中提到过

key_t ftok(const char *pathname, int proj_id);
Run Code Online (Sandbox Code Playgroud)

ftok()函数使用由给定路径名命名的文件的标识(必须引用现有的可访问文件) ...

我很困惑const char *pathname.

它最好的做法是什么?在我当前的系统上,我可以通过"/home/Andrew/anyfile"但是我的程序必须运行的其他系统不可能拥有此文件.

我如何使用"/etc/hosts/""/etc/inittab"因为我确定所有这些系统都有这两个文件?这是个好主意吗?它会引起任何问题吗?

我不想要求用户在执行时输入文件名或将文件名作为命令行参数传递.

还有其他不同的更好的方法来决定pathname吗?
哪种方式最好,最可靠?

谢谢你的时间.

c linux queue ipc ftok

13
推荐指数
1
解决办法
8288
查看次数

如果访问共享内存的关键是shmget()的返回值,那么拥有key_t有什么意义呢?

使用共享内存时,我们为什么要关心创建密钥

key_t ftok(const char *path, int id);
Run Code Online (Sandbox Code Playgroud)

在下面的代码中?

key_t key;
int shmid;

key = ftok("/home/beej/somefile3", 'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);
Run Code Online (Sandbox Code Playgroud)

根据我的理解,访问给定共享内存所需的是shmid,而不是密钥.还是我错了?如果我们需要的是shmid,每次不仅仅创建一个随机密钥有什么意义呢?

编辑

@ Beej的Unix IPC指南可以阅读:

key废话怎么样?我们如何创建一个?好吧,因为类型 key_t实际上只是一个long,你可以使用你想要的任何数字.但是如果你硬编码数字和其他一些不相关的程序硬编码相同的数字但想要另一个队列呢?解决方案是使用ftok() 从两个参数生成密钥的函数.

读到这一点,它给我的印象是,需要附加到共享内存块的关键是什么.但事实并非如此,是吗?

c unix shared-memory ftok

13
推荐指数
2
解决办法
2万
查看次数

什么是消息队列中的目的ftok

我已经开始在Linux上读取消息队列中的一个IPC机制.但是在第一步我有一些非常基本的问题.

  1. 使用ftok()生成唯一的ID(键),什么是独特的ID将被生成.

  2. 我们不能使用简单的数字来获取我们的密钥而不是使用它ftok()吗?

  3. 什么是争论的目的keymsget功能?

    #include "sys/msg.h"
    key = ftok("/home/beej/somefile", 'b');
    msqid = msgget(key, 0666 | IPC_CREAT);
    
    Run Code Online (Sandbox Code Playgroud)
  4. msqid和之间有什么区别key

c ipc ftok

9
推荐指数
1
解决办法
2万
查看次数

ftok()碰撞

ftok()用来为C应用程序使用的共享内存段生成标识符.我遇到了问题,在一个盒子上我遇到了root使用的标识符.我可以通过破解代码在这个例子中修复它,但我想要一个更强大的解决方案.

应用程序安装在自己的逻辑卷中,提供给ftok的路径是应用程序的二进制目录(在该lv中).提供的ID从1开始,通常有6个左右.

我已经追踪到ftok会做这样的事情:

(id & 0xff) << 24 | (st.st_dev & 0xff) << 16 | (st.st_ino & 0xffff)
Run Code Online (Sandbox Code Playgroud)

st.st_dev/st.st_ino的组合应该是非常独特的.但是我已经看过很多方框,st_dev的最低位通常是0(即st_dev数字通常是256的倍数).并且由于二进制目录位于逻辑卷中,因此无法保证inode编号与root用户不同.

有没有一个很好的方法 - 一个更好的替代ftok,或一种设置机器,使得st_dev数字将更有用于ftok?

c linux shared-memory ftok

8
推荐指数
1
解决办法
2304
查看次数

使用C了解共享内存

使用C,我正在尝试设置共享内存.我的代码看起来像:

key_t key = ftok("SomeString", 1);
static int *sharedval;
int shmid = shmget(key, sizeof(int), S_IRUSR | S_IWUSR); // less permissions
sharedval = (int *) shmat(shmid, NULL, 0);
*sharedval = 0;
Run Code Online (Sandbox Code Playgroud)

然而,第二个我运行最后一行,我得到一个分段错误.调试时,我可以打印"sharedval",我得到一个内存地址,大概就是我得到的内存中的位置.所以我认为我所要做的就是*sharedval用来评估它,但显然不是.我怎么想从共享内存中读取?向正确的方向推进将是美妙的.谢谢!

编辑:

another.anon.coward的输出:

$ ./a.out 
ftok: No such file or directory
shmget: No such file or directory
Trying shmget with IPC_CREAT
shmget success
shmat success
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)

c linux memory ftok

3
推荐指数
1
解决办法
8985
查看次数

生成 ftok() 密钥的公式是什么?

用于生成 ftok() 生成的密钥的公式是什么?ftok 是一个用于为 SYSTEM V IPC 创建密钥的 Linux 函数。

c linux ftok sysv-ipc

2
推荐指数
1
解决办法
918
查看次数

msgget() 和 ftok() 错误

我正在学习IPC编程。作为其中的一部分,我尝试了以下两个代码来了解消息队列......

消息队列创建者或消息发送者

struct my_msgbuf {
    long mtype;
    char mtext[200];
};

int main(void)
{
    struct my_msgbuf buf;
    int msqid;
    key_t key;
if ((key = ftok("kirk.c", 'B')) == -1) {
    perror("ftok");
    exit(1);
}

if ((msqid = msgget(key, 0644 | IPC_CREAT)) == -1) {
    perror("msgget");
    exit(1);
}

printf("Enter lines of text, ^D to quit:\n");

buf.mtype = 1; /* we don't really care in this case */

while(fgets(buf.mtext, sizeof buf.mtext, stdin) != NULL) {
    int len = strlen(buf.mtext);

    /* ditch newline at end, if …
Run Code Online (Sandbox Code Playgroud)

c ipc message-queue ftok

1
推荐指数
1
解决办法
1万
查看次数

标签 统计

c ×7

ftok ×7

linux ×4

ipc ×3

shared-memory ×2

memory ×1

message-queue ×1

queue ×1

sysv-ipc ×1

unix ×1