原型如下:
DosCreateNPipe (PSZ pszName, PHPIPE pHpipe, ULONG openmode,
ULONG pipemode, ULONG cbOutbuf, ULONG cbInbuf, ULONG msec)
pszName
管道的名字
pHpipe
管道句柄。
openmode
一组标志,定义了打开管道时的模式。
pipemode
一组标志,定义了管道的模式。
cbOutbuf和 cbInbuf
出入buf
msec
等待有名管道实例变为可用时等待的最长时间,单位是毫秒。
"\\pipe\\gtemp"是创建的命名管道的对象名字,像在Windows2000内核里边,命名管道是一种内核对象,所有的内核对象都由对象管理器来管理,而且是一种树状的,就像文件夹那样一层一层的,在Windows下在Softice里输入objdir就可以查看内核对象。
你创建一个NamedPipe,当然要放在\pipe下边了
至于为什么用"\\",你应该知道C语言里边"\"是转义符啊,前一个\是转义符,这是基本的C语言常识了
就像在Windows下用CreateFile新建一个文件,文件名要写"C:\\xxx\\yyy\\newfile.txt"这样
还有HPIPE,这是管道句柄,调用这个函数成功后,返回的管道句柄就放在hpipe里,以后就可以用这个句柄来读写这个命名管道了。
这个DosCreateNPipe类似于Windows下的CreateNamedPipe、Linux下的mkfifo
下边是CreateNamedPipe的原型,和DosCreateNPipe是比较像的,只不过返回的管道句柄放在返回值里:
HANDLE CreateNamedPipe(
LPCTSTR lpName,
DWORD dwOpenMode,
DWORD dwPipeMode,
DWORD nMaxInstances,
DWORD nOutBufferSize,
DWORD nInBufferSize,
DWORD nDefaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
)
在st_mode的特征位定义里有:S_IFIFO 0010000 //先进先出(fifo)
fifo是管道文件,分为分为无名管道和有名管道。
无名管道例如:ls-l | grep name 使用管道可将一个命令的输出作为另一个命令的输入。命令执行时,无名管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是单独构成一种文件系统,并且只存在于内存中。无名管道是临时的,执行完成后会自动消失。由于没有名字,无名管道只能用于亲缘关系的进程间通信.
有名管道即FIFO,在文件系统中有自己文件名路径名,这样即使两个不相关(没有亲缘关系)的进程,只要可以访问该路径,就能够彼此通过创建FIFO相互(经常性的而非临时的)通信。有名管道的名字存在于文件系统中,但内容还是存放在内存中。
S_IFIFO 即表示有名管道文件。具体介绍和应用,还请翻阅“进程间通信--管道”的相关内容。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)