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

fork()とpipe()をデモンストレーションするCプログラム


この問題では、fork()とpipe()をデモンストレーションします。ここでは、2つの文字列を連結するLinux用のCプログラムを作成します。2つのプロセスを使用して、1つは入力を受け取り、それを他のプロセスに送信します。これにより、文字列が事前定義された文字列と連結され、連結された文字列が返されます。

まず、 fork()とpipe()を要約します

fork() −子プロセスを作成します。この子プロセスは、新しいPIDとPPIDを作成します。

pipe() プロセス間通信に使用されるUnix、Linuxシステムコールです。

問題を理解するための例を見てみましょう

入力

Learn programming
Predefined string: at tutorialspoint

出力

Learn programming at tutorialspoint

説明

P1 take input of string “learn programming”

パイプを使用してP2に送信します。

P2は文字列を連結し、それを印刷するp1に送り返します。

プログラムでは、fork()関数を使用してP1とP2の2つのプロセスを作成します。プログラムの状態を示す次の3つの戻り値があります。

戻り値<0、プロセスの作成に失敗しました。

戻り値=0、子プロセス。

戻り値>0。これは、親プロセスに対する子プロセスのプロセスIDになります。つまり、親プロセスが実行されます。

パイプは一方向であるため、1つはP1からP2に、もう1つはP2からP1に通信するための2つのパイプを作成します。

fork()とpipe()をデモンストレーションするCプログラム

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<sys/wait.h>
int main(){
   int p12[2];
   int p21[2];
   char fixed_str[] = " at tutorialspoint";
   char input_str[100];
   pid_t P;
   if (pipe(p12)==-1 || pipe(p21)==-1 ){
      fprintf(stderr, "Filed to create pipe" );
      return 1;
   }
   scanf("%s", input_str);
   P = fork();
   if (P < 0){
      fprintf(stderr, "fork Failed" );
      return 1;
   }
   else if (P > 0){
      char concat_str[100];
      close(p12[0]);
      write(p12[1], input_str, strlen(input_str)+1);
      close(p12[1]);
      wait(NULL);
      close(p21[1]);
      read(p21[0], concat_str, 100);
      printf("Concatenated string %s\n", concat_str);
      close(p21[0]);
   }
   else{
      close(p12[1]);
      char concat_str[100];
      read(p12[0], concat_str, 100);
      int k = strlen(concat_str);
      int i;
      for (i=0; i<strlen(fixed_str); i++)
      concat_str[k++] = fixed_str[i];
      concat_str[k] = '\0';
      close(p12[0]);
      close(p21[0]);
      write(p21[1], concat_str, strlen(concat_str)+1);
      close(p21[1]);
      exit(0);
   }
}

出力

Concatenated string Learn at tutorialspoint

  1. ポストインクリメントおよびプレインクリメント演算子を示すCプログラムを作成します

    インクリメント演算子(++) 変数の値を1ずつインクリメントするために使用されます。インクリメント演算子には、プリインクリメントとポストインクリメントの2種類があります。 インクリメント演算子は、プリインクリメントのオペランドの前に配置され、値が最初にインクリメントされてから、演算が実行されます。 たとえば、 z = ++a; a= a+1 z=a インクリメント演算子は、ポストインクリメントのオペランドの後に配置され、演算の実行後に値がインクリメントされます。 たとえば、 z = a++; z=a a= a+1 例1 以下は、プリインクリメント演算子の例です-

  2. 文字列とそのアドレスへのポインタの配列を出力するCプログラム

    まず、Cプログラミング言語でのポインターの配列を理解しましょう。 ポインタの配列:(文字列へ) これは、要素が文字列の基本加算へのptrsである配列です。 次のように宣言および初期化されます- char *a[ ] = {"one", "two", "three"}; ここで、a[0]は文字列「one」の基本加算へのポインタです。 a [1]は、文字列「two」の基本加算へのポインタです。 a [2]は、文字列「three」の基本加算へのポインタです。 利点 ポインタの配列の利点を以下に説明します-