Windows匿名管道实际上是普通管道,它们的行为与UNIX管道类似:它们是单向的,并且在通信进程之间采用父子关系。另外,可以使用普通的ReadFile()和WriteFile()函数来完成对管道的读取和写入。Windows API使用CreatePipe()函数创建管道,该函数传递了四个参数。这些参数为
阅读和
写入管道
STARTUPINFO结构的实例,用于指定子进程将继承管道的句柄。
可以指定管道的大小(以字节为单位)。
与UNIX系统不同,Windows要求程序员指定子进程将继承哪些属性。这是通过首先初始化SECURITY ATTRIBUTES结构来允许继承句柄,然后将子进程的标准输入或标准输出的句柄重定向到管道的读取或写入句柄来实现的。由于孩子将从管道中读取数据,因此父级必须将孩子的标准输入重定向到管道的读取句柄。由于管道是半双工的,因此需要禁止孩子继承管道的写端。
在下面的代码中,我们可以看到父进程创建了一个匿名管道以与其子进程进行通信-
#include<stdio.h> #include<stdlib.h> #include<windows.h> #define BUFFER SIZE 25 int main(VOID) { HANDLE ReadHandle, WriteHandle; STARTUPINFO si; PROCESS INFORMATION pi; char message[BUFFER SIZE] = "Greetings"; DWORD written; /* set up security attributes to allow pipes to be inherited */ SECURITY ATTRIBUTES sa = {sizeof(SECURITY ATTRIBUTES), NULL, TRUE}; /* allocate memory */ ZeroMemory(π, sizeof(pi)); /* create the pipe */ if (!CreatePipe(&ReadHandle, &WriteHandle, &sa, 0)) { fprintf(stderr, "Create Pipe Failed"); return 1; } /* establishing the START INFO structure for the child process*/ GetStartupInfo(&si); si.hStdOutput = GetStdHandle(STD OUTPUT HANDLE); /* redirecting standard input to the read end of the pipe */ si.hStdInput = ReadHandle; si.dwFlags = STARTF USESTDHANDLES; /* don’t allow the child inheriting the write end of pipe */ SetHandleInformation(WriteHandle, HANDLE FLAG INHERIT, 0); /* create the child process */ CreateProcess(NULL, "child.exe", NULL, NULL, TRUE, /* inherit handles */ 0, NULL, NULL, &si, π); /* close the unused end of the pipe */ CloseHandle(ReadHandle); /* the parent writes to the pipe */ if(!WriteFile(WriteHandle, message, BUFFER SIZE, &written, NULL)) fprintf(stderr, "Error writing to pipe."); /* close the write end of the pipe */ CloseHandle(WriteHandle); /* wait for the child to exit */ WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; }
父级先关闭未使用的管道读取端,然后再写入管道。下面的代码显示了从管道读取的子进程-
#include<stdio.h> #include<windows.h> #define BUFFER SIZE 25 int main(VOID){ HANDLE Readhandle; CHAR buffer[BUFFER SIZE]; DWORD read; /* getting the read handle of the pipe */ ReadHandle = GetStdHandle(STD INPUT HANDLE); /* the child reads from the pipe */ if (ReadFile(ReadHandle, buffer, BUFFER SIZE, &read, NULL)) printf("child read %s", buffer); else fprintf(stderr, "Error reading from pipe"); return 0; }
Windows匿名管道-子进程
一个元素可以按照HTML元素的嵌套方式包含其他元素,大多数情况下,框都是由显式定义的元素所生成的。 然而,当把文本直接添加到一个块容器元素中(不是包含在行内元素)时,即便没有为这些文本显式定义元素,它们也会生成框。 没有被元素显式包含的文本,称作匿名文本,因为没有与之关联的元素。把匿名文本所生成框,称作匿名框。匿名框分为两种,一种是匿名块框,另一种是匿名行内框。 当把文本直接添加到一个块容器元素中
我目前在PHP中使用proc_open()与命令行工具进行通信。它会自动为STDIN、STDOUT和STDERR创建多达3个文件描述符,因为超过3个管道会破坏Windows兼容性。它适用于Windows XP和我的Mac 10.7。 然而,我希望能够创建我自己的命名管道,以便更好地控制。如果我不能这样做,那么我必须维护进程资源及其流资源之间的引用,这使我的代码过于复杂。我不能使用文件,因为它们会填
匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下: 这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。使用匿名类可使代码更加简洁、紧凑,模块化程度更高。 匿名类有两种实现方式: 继承一个类,重写其方法。 实现一个接口(可以是多个),实现其方法。 下面通过代码来说明。 程序的输出结果如下: 从输出结果可以看出,匿名内部类有
5.6. 匿名函数 拥有函数名的函数只能在包级语法块中被声明,通过函数字面量(function literal),我们可绕过这一限制,在任何表达式中表示一个函数值。函数字面量的语法和函数声明相似,区别在于func关键字后没有函数名。函数值字面量是一种表达式,它的值被成为匿名函数(anonymous function)。 函数字面量允许我们在使用函数时,再定义它。通过这种技巧,我们可以改写之前对st
有没有想过定义一个很短的回调函数,但又不想用 def 的形式去写一个那么长的函数,那么有没有快捷方式呢? 答案是有的。 python 使用 lambda 来创建匿名函数,也就是不再使用 def 语句这样标准的形式定义一个函数。 匿名函数主要有以下特点: lambda 只是一个表达式,函数体比 def 简单很多。 lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封
当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。 在Python中,对匿名函数提供了有限支持。还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数: >>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81]