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
-
ポストインクリメントおよびプレインクリメント演算子を示すCプログラムを作成します
インクリメント演算子(++) 変数の値を1ずつインクリメントするために使用されます。インクリメント演算子には、プリインクリメントとポストインクリメントの2種類があります。 インクリメント演算子は、プリインクリメントのオペランドの前に配置され、値が最初にインクリメントされてから、演算が実行されます。 たとえば、 z = ++a; a= a+1 z=a インクリメント演算子は、ポストインクリメントのオペランドの後に配置され、演算の実行後に値がインクリメントされます。 たとえば、 z = a++; z=a a= a+1 例1 以下は、プリインクリメント演算子の例です-
-
文字列とそのアドレスへのポインタの配列を出力するCプログラム
まず、Cプログラミング言語でのポインターの配列を理解しましょう。 ポインタの配列:(文字列へ) これは、要素が文字列の基本加算へのptrsである配列です。 次のように宣言および初期化されます- char *a[ ] = {"one", "two", "three"}; ここで、a[0]は文字列「one」の基本加算へのポインタです。 a [1]は、文字列「two」の基本加算へのポインタです。 a [2]は、文字列「three」の基本加算へのポインタです。 利点 ポインタの配列の利点を以下に説明します-