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」の基本加算へのポインタです。 利点 ポインタの配列の利点を以下に説明します-