首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux信号量及函数

参数key为一个键值,可通过ftok()函数生成,参数nsems为创建的信号量集中包含的信号量个数,参数flag为操作参数,具体使用方法与创建共享内存的shmget()使用类似。...semncnt的值加1**,函数semop()成功返回; 信号量被删除,函数semop()出错返回EIDRM; 进程捕捉到信号,并从信号处理函数返回,信号量的**semncnt的值减1**,函数semop...,**信号值减去sem_op的绝对值**,成功返回; 信号量被删除,函数semop()出错返回EIDRM; 进程捕捉到信号,并从信号处理函数返回,信号量的**semncnt的值减1**,函数semop(...这里说明一下ftok()函数生成key的原理,ftok()定义如下: key_t ftok(const char *pathname, int proj_id); 首先根据一个任意存在的pathname...路径提取其所属文件系统的特有信息,包括设备号(stat.st_dev)和inode号(stat.st_ino),其获取方法参见上述程序中的sata结构,然后再结合ftok()函数的proj_id参数,按照如下规则计算

2.1K30

PHP共享内存详解 前言

前言 在PHP中有这么一族函数,他们是对UNIX的V IPC函数族的包装。 它们很少被人们用到,但是它们却很强大。巧妙的运用它们,可以让你事倍功半。...但是,首先,我们需要介绍几个重要的基础: 1. ftok int ftok ( string pathname, string proj ) //ftok将一个路径名pathname和一个项目名(必须为一个字符...创建内存段 共享内存函数类似于文件操作函数,但无需处理一个流,您将处理一个共享内存访问 ID。第一个示例就是 shmopopen 函数,它允许您打开一个现有的内存段或创建一个新内存段。...此函数非常类似于经典的 fopen 函数,后者打开用于文件操作的流,返回一个资源供其他希望读取或写入该打开的流的函数使用。让我们看看 shmopopen的用法: <?...通常情况下,该key值通过ftok函数得到, * *key是一个我们逻辑上表示共享内存段的标识。不同进程只要选择同一个Key值就可以共享同一段存储段。

1.3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    linux 进程通信-共享内存(shared memory)《Rice linux 学习开发》

    共享内存的实现步骤 创建/打开共享内存 映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问 撤销共享内存映射 删除共享内存对象 共享内存相关函数 shmget()函数:创建共享内存 其中,key_y...:是由函数ftok()返回。...ftok()函数原型:key_t ftok(char *fname, int id) fname:指定的文件名(该文件必须存在而且可以访问) id:子序号,虽然为int,但是只有8个比特被使用(0-255...) 当成功执行的时候,一个key_t值将会被返回,否则-1被返回 shmat()函数:内存映射,并获的映射地址 shmdt()函数:断开共享内存连接 shmctl()函数:共享内存管理 例程 共享内存例程请参考

    1K10

    从并发处理谈PHP进程间通信(二)System V IPC

    文化的读写有瓶颈,mysql 和 redis 会挂掉或连接超时,归根结底总觉得在 HACK; 对于进程间通信,每一个完备的语言都应该有对应的处理方式,而 PHP 对应的则是一族对 UNIX SYSTEM V包装的函数...函数介绍 ftok int ftok ( string $pathname, string $proj ) ftok将一个路径 pathname 和一个项目名(必须为一个字符), 转化成一个整数形的 System...V IPC 键,本文介绍的 System V 通信方式都是基于此键来完成的,此ID 值也可以自己指定一个 INT 型来确定,不必要使用 ftok 获取; 需要注意的是:ftok 的结果是通过文档的索引节点号来计算获取的...,而文件的删除重建会导致其索引节点号变动,所以即使是相同的文件名,也可能会导致获取到的 IPC 键不同,所以需要尽量保证 $pathname 不变动; semaphore函数 resource sem_get...shared_memory函数 resource shm_attach ( int $key [, int $memsize [, int $perm = 0666 ]] ) bool shm_detach

    1.2K80

    php共享内存shmop遇到的坑

    函数获取系统共享内存唯一编号key_t,虽然pathname和proj不变,key_t也可能会变化,偶尔发现什么数据也没改动共享内存数据为空了 key_t = ftok ( string $pathname..., string $proj ) ftok获取的健值是由ftok函数的第二个参数的后8位,st_dev的后8位,st_ino的后16位构成的: char filename[50]; struct...( filename, 0x27 ) = %x, st_ino = %x, st_dev= %x\n", ftok( filename, 0x27 ), buf.st_ino, buf.st_dev )...函数获取系统共享内存唯一编号key_t,虽然pathname和proj不变,key_t也可能会变化,偶尔发现什么数据也没改动共享内存数据为空了 key_t = ftok ( string $pathname..., string $proj ) ftok获取的健值是由ftok函数的第二个参数的后8位,st_dev的后8位,st_ino的后16位构成的: char filename[50]; struct

    1.3K10

    Linux进程通信--共享内存

    总结一下: 共享内存=内存空间(数据)+共享内存的属性 共享内存的操作 创建共享内存函数接口 创建共享内存函数接口为:shmget #include #include <sys...这个文件在使用 ftok 函数时不会被打开或读取,只是用于生成唯一的键值。 proj_id:是一个用户定义的整数,通常是0到255之间的数字。...返回值: ftok 函数返回一个key_t类型的键值,如果发生错误则返回 -1,并设置 errno 来指示错误的原因。...*buf); 参数: shmid:由shmget返回的共享内存标识码 cmd:将要采取的动作(有三个可取值) buf:指向一个保存着共享内存的模式状态和访问权限的数据结构 删除共存内存函数代码演示 删除共享内存的函数接口写在上述析构函数中...<<std::endl; } 运行结果: 共享内存段连接到进程地址空间函数接口 共享内存段连接到进程地址空间函数为shmat: #include #include <sys/

    10410

    Linux进程通信之消息队列

    在PHP扩展中,封装了8个消息队列相关的函数,有 ftok、msg_get_queue、msg_queue_exists、msg_receive、msg_remove_queue、msg_send、msg_set_queue...msg_stat_queue 具体的相关参数以及介绍,请查看PHP手册及相关文档 PHP手册之IPC 不同进程间消息队列通信 写进程demo21.php //根据一个存在的文件和标识生成消息队列的key $key = ftok...key $key = ftok('demo21.php','a'); //创建消息队列 $msgId = msg_get_queue($key); //接收消息队列消息 msg_receive($msgId...message); 执行命令,查看返回结果,可以看到我们写入的数据 再次调用ipcs查看消息队列相关信息,发现数据已被取走并清零 父子进程消息队列通信 假设是子进程接收,父进程发送 $key = ftok...舍弃其他字节数据 当接收数据为非阻塞方式时,设置MSG_IPC_NOWAIT(msg_receive函数的第七个参数),系统会一直调用底层函数并返回失败,造成CPU资源浪费

    2.7K20

    Linux笔记(16)| 进程同步机制——管道和IPC

    IPC的关键字一般可以使用IPC_PRIVATE,也可以使用ftok函数获得,他们有一些区别,后面会提到。...ftok函数的使用: key_t ftok(const char* pathname,int proj_id); ftok函数是用于将一个路径和项目ID转换为关键字,第一个参数必须是一个存在的、可以访问的文件路径名...当key使用ftok函数得到的关键字时,flag参数不仅决定对象的存取权限,还和创建方式有关,具体就是: 设置flag参数的IPC_CREAT位,但不设置IPC_EXCL位,如果不存在指定key的IPC...这和文件操作函数open是类似的。 接下来介绍一下各个IPC对象涉及到的API函数。由于具体的细节比较多,这里就不一一罗列了,可以使用man手册来查看具体细节。...(argv[1],0); if(semkey==-1){ printf("semkey ftok failed\n"); exit(0); } shmkey=ftok(argv

    2K20

    进程间通讯(五).message queue(2)

    msgqueB.c #include #include //key_t,ftok,msgget,msgrcv,msgctl,IPC_RMID 相关声明在这个头文件中有所包含...("/",18))) //调用ftok使用相同的参数生成key,用于获取一样的队列ID { perror("ftok"); return res; } if(-1==(qid...此函数的原型在 sys/ipc.h 中 /* Generates key for System V style IPC. */ extern key_t ftok (__const char *__...,取值可以是:0,表示忽略;IPC_NOWAIT,如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程。...函数调用成功时,该函数返回放到接收缓存区中的字节数,消息被复制到由msgp指向的用户分配的缓存区中,然后删除消息队列中的对应消息; 失败时返回-1 ---- msgctl msgctl 的原型定义在 sys

    82320

    PHP进程通信之管道与消息队列(二十三节)

    这个函数的好处就是帮我们屏蔽掉了手工创建管道的操作,可惜只能是半双工,如果你想要全双工版本的popen,那么下面这个proc_open()函数将会拍的上场,这个函数除了可以创建全双工管道外,还额外提供了大量控制配置参数...php // 使用ftok创建一个键名,注意这个函数的第二个参数“需要一个字符的字符串” $key = ftok( __DIR__, 'a' ); // 然后使用msg_get_queue创建一个消息队列...$queue = msg_get_queue( $key, 0666 ); // 使用msg_stat_queue函数可以查看这个消息队列的信息,而使用msg_set_queue函数则可以修改这些信息...php // 使用ftok创建一个键名,注意这个函数的第二个参数“需要一个字符的字符串” $key = ftok( "/Users/didi/python", "a" ); // 然后使用msg_get_queue...*NIX下搞系统级编程,C语言提供的ftok函数实际上第二个参数确实是个整形数字,范围是0-255,我也不知道PHP为啥用字母;如果你搞过C,你应该知道实际上在C里字符本质上是数字,确切说字母a就是ASCII

    1.4K31

    shm进程间通信失败了!!!

    key值有fotk函数生成,如果对ftok函数不熟,有空可以看一下这篇:ftok 讲的是极好的,不是我写的。 我遇到的第一个问题,是:不同参数的ftok生成同样的shmid值。 为什么呢?...ftok的第一个参数得是有效的文件路径。...看了上面那篇文章之后,我将代码进行了修改,接下来就遇到了第二个问题:同样参数的ftok函数生成了不同的key值 这个就不好找咯,上面那个还能在网上找到点蛛丝马迹,这个要是找到希望能在下面给我留个网址,...如果你用的是绝对目录那就比较好,但是如果给ftok传参传的是相对目录,而你运行的两个执行文件所在的目录又不同,那么ftok计算key值时从当前进程所在目录出发,自然是会有偏差的。 怎么办?怎么办?

    54510

    php进程通信-消息队列

    如果要使用linux的消息队列,需要安装sysvmsg扩展,官方文档地址:http://php.net/manual/zh/book.sem.php 三:php使用消息队列 1:获取一个IPC标识符ftok...(); ftok,可将项目路径与文件标识转换成一个IPC标识符,该标识符可用于创建消息队列 ?...该函数将失败并返回对应的整数值MSG_ENOMSG。 MSG_EXCEPT 将此标志与desiredmsgtype大于0 结合使用 会导致函数接收到不等于的第一条消息 desiredmsgtype。...[, int &$errorcode ]]] )如果该函数失败,errorcode 则可选项将被设置为系统errno变量的值。 ?...5:删除队列msg_remove_queue ( resource $queue ) 顾名思义,该函数可删除一个消息队列 四:linux相关操作 在linux中,主要用ipcs(查看) ipcrm(删除

    1.6K20
    领券