qnx获取旧资源pipe理器的resmgr_context_t

我试图为qnx 6.6 over / proc / {pid} / as创build我自己的进程pipe理器。

但是我只需要改变一个操作(io_open),所有其他操作应该继续使用旧文件(/ proc / {pid} / as)。

我可以只是得到指针resmgr_context_t(从path或fd,在resmgr_attach之前)和所有其他操作只是调用默认function?

这是我想要的例子:

resmgr_context_t* old_context; int my_lseek(resmgr_context_t *ctp, io_lseek_t *msg, RESMGR_OCB_T *ocb){ return iofunc_lseek_default(old_context, msg, ocb); } 

您需要创建一个只为io_open注册函数的常规资源管理器,所有其他资源管理器操作将过滤到堆栈中较低的资源管理器。

如果您希望消息将resmgr堆栈向下移动到其他注册的io_open回调,则从io_open回调中返回ENOENT,否则返回EOK。

为简洁起见,省略错误检查。

 #include <errno.h> #include <stdio.h> #include <stddef.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <time.h> #include <sys/iofunc.h> #include <sys/dispatch.h> static resmgr_connect_funcs_t connect_funcs; static resmgr_io_funcs_t io_funcs; static iofunc_attr_t attr; int io_open (resmgr_context_t *ctp, io_open_t *msg, RESMGR_HANDLE_T *handle, void *extra); int main(int argc, char **argv) { resmgr_attr_t resmgr_attr; dispatch_t *dpp; dispatch_context_t *ctp; int id; // initialize dispatch interface dpp = dispatch_create(); // initialize resource manager attributes memset(&resmgr_attr, 0, sizeof resmgr_attr); resmgr_attr.nparts_max = 1; resmgr_attr.msg_max_size = 2048; // initialize functions for handling messages iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs, _RESMGR_IO_NFUNCS, &io_funcs); connect_funcs.open = io_open; // initialize attribute structure used by the device iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0); // attach to /proc/{pid}/as path, replace '1' with correct pid resmgr_attach(dpp, &resmgr_attr,"/proc/1/as", _FTYPE_ANY, _RESMGR_FLAG_BEFORE|_RESMGR_FLAG_DIR, &connect_funcs, &io_funcs, &attr); ctp = dispatch_context_alloc(dpp); /* start the resource manager message loop */ while(1) { if((ctp = dispatch_block(ctp)) == NULL) { perror("dispatch_block"); return EXIT_FAILURE; } dispatch_handler(ctp); } } int io_open (resmgr_context_t *ctp, io_open_t *msg, RESMGR_HANDLE_T *handle, void *extra) { time_t tod; tod = time(NULL); printf ("%10d %-32s is being opened\n", tod, msg->connect.path); return(ENOENT); }