ftok应用范围:在IPC通信及消息中使用

lys2019年11月18日 0条评论

ftok应用范围:在IPC通信及消息中使用
解析:
       系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。
在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。
如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0x26010002。

       ftok的第一个参数是一个文件的路径名称.一般在应用系统中,使用$HOME或者应用系统的根目录作为它的值.这样产生的key_t就不会与系统中其他的软件和系统的相同了,从而避免造成冲突. 如果,你使用配制文件,或者写死在程序里面,key_t的值有可能与系统中其他的软件. ftok的第二个参数是用于你在自己的系统里产生多个IPC的时候,区分它们使用的. 总之,  ftok的首个参数是用于与其他系统相区别的. 

       第二个参数是用于本系统的不同的IPC区别使用的.

<?php
 
$msg_key = ftok( __FILE__, 'a' );   //生成避免冲突值
$msg_queue = msg_get_queue( $msg_key, 0666 );
 
//启动进程
$pid = pcntl_fork();
 
if( $pid == 0 ){
    //子进程向父进程报告
    msg_send( $msg_queue, 1, "father i am " . getmypid(). " and i am working! \n" );
    exit();  //退出子进程
}else if( $pid ){
    msg_receive( $msg_queue, 0, $message_type, 1024, $message, TRUE, MSG_IPC_NOWAIT );
    echo $message;
    pcntl_wait( $status );  //阻塞回收子进程
    if( $status ){
      msg_remove_queue( $msg_queue );
    }
}