C 語言程式演示 fork() 和 pipe()
在本問題中,我們將演示 fork() 和 pipe()。這裡我們將建立一個用於 Linux 的 C 程式,使用 2 個程序,一個程序獲取輸入並將其傳送給另一個程序,另一個程序將字串與預定義字串連線並返回連線後的字串。
首先讓我們回顧一下 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,p1 列印它。
在程式中,我們將使用 fork() 函式建立兩個程序,稱為 P1 和 P2。它有以下三個返回值,顯示程式的狀態。
返回值 < 0,程序建立失敗。
返回值 = 0,子程序。
返回值 > 0,這將是子程序的程序 ID 傳遞給父程序,即父程序將被執行。
我們將建立兩個管道,一個用於從 P1 到 P2 的通訊,另一個用於從 P2 到 P1 的通訊,因為管道是單向的。
C 語言程式演示 fork() 和 pipe()
示例
#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
", 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
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP