Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

Windows無名パイプ


Windowsの無名パイプは実際には通常のパイプであり、UNIXの対応するパイプと同様に動作します。単方向であり、通信プロセス間で親子関係を使用します。さらに、パイプの読み取りと書き込みは、通常のReadFile()関数とWriteFile()関数を使用して実行できます。 Windows APIは、4つのパラメーターが渡されるパイプを作成するために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;
}

Windows無名パイプ-親プロセス

親は、パイプに書き込む前に、まずパイプの未使用の読み取り端を閉じます。パイプから読み取る子プロセスを以下のコードに示します-

#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無名パイプ-子プロセス


  1. Windows 11 SE とは何ですか?

    Chromebook と Chrome オペレーティング システムが教育市場をほぼ独占してきましたが、Microsoft はかなり長い間、競争の場に参入して平準化しようと試みてきました。 Windows 11 SE では、まさにそれを達成しようとしています。このオペレーティング システムは、K-8 クラスルームで作成されました 念頭に置いて。使いやすく、安全性が高く、機能が制限された低コストのコンピューターにより適していると考えられています。この新しい OS の開発中、Microsoft は教育者、学校の IT 担当者、および管理者と協力しました。 Windows 11 SE 用に特別に作成さ

  2. Windows 10 でお子様のアカウントを管理する方法

    以前、Windows 10 でさまざまな種類のアカウントを作成する際に使用できる方法について説明しました。 また、コンピューターでアクセスする方法も示しましたが、子供のアカウントを管理する方法については詳しく説明していません.お子様が特定のアプリを使用したり、悪意のあるコンテンツを含む Web サイトにアクセスしたりすることを実際に禁止できることをご存じですか? お子様が PC を使用できる時間帯と使用できない時間帯を設定することもできます。これらはすべてアカウント セクションで設定できます。 設定機能の Windows 10 コンピューターで。ただし、これらの手順に進む前に、まず