(警告 - 完全な英語ではありません)Linux。データを別のプロセスに送信する。書くと読む
コラージュでは、彼らは私に仕事を与えてくれました。私はそれを数時間苦労して解決できません。 あるプロセスから別のプロセスにデータを送信する際に問題があります。以下のコードでは、入力データを子プロセスに送信していますが、子プロセスからは受け取っていません。あなたはこれで助けてくれますか?
プログラムの説明:私の仕事は、ユーザーからの入力を受け取り、パイプを使用して子プロセスに送信し、いくつかの計算を行い、この計算を次のプロセスにさらに送信することです。最後のプロセスは入力データを合計し、最終結果に割り当てます。具体的には、最初の子プロセスはMaclaurinシリーズの単一項を計算し、それを合計するプロセスに送ります。ここでは、コードは次のとおりです。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <math.h>
#include <sys/stat.h>
int mkfifo(const char *s, mode_t m) {
return 0;
}
int i = 1;
double FINAL_RESULT = 0 ;
double factorial(int N){
if(N==1)return 1.0;
return N*factorial(N - 1);
}
double Maclaurine(int i , double x , double eps){
double result;
result = (pow(x,(double)i)/(double)factorial(i));
if(result < eps) return 0;
return result;
}
void print(char * tab, int size){
printf("\n");
for(int i = 0; i < size ; i++){
printf("%c" , tab[i]);
}
printf("\n");
}
int main(){
int pd;
if(mkfifo("tmp/myfifo1", 0666) == -1){
printf("Failed to create myfifo2\n");
}
if(mkfifo("tmp/myfifo2", 0666) == -1){
printf("Failed to create myfifo2\n");
}
pd = open("tmp/myfifo1", O_WRONLY);
double x1,eps1;
printf("X Value : \n");
scanf("%lf", &x1);
printf("EPS Value : \n");
scanf("%lf", &eps1);
char tab1[128], tab2[128];
//converting to char*
sprintf(tab1,"%lf",x1);
sprintf(tab2,"%lf",eps1);
//printing to standard output
print(tab1, strlen(tab1));
print(tab2, strlen(tab2));
//creating new process
if(fork() == 0){
//creating another process
if(fork() == 0){
int pd3;
pd3 = open("tmp/myfifo2", O_RDONLY);
char tab5[128];
double x3;
//reading data from pipe , myfifo2
read(pd3,tab5,sizeof(tab5));
//converting char* to float
x3 = atof(tab5);
FINAL_RESULT += x3;
printf("\nCurrent result = %lf" , FINAL_RESULT);
}
int pd2;
//opening myfifo1 for reading
pd2 = open("tmp/myfifo1", O_RDONLY);
if(pd2 == - 1){
printf("\nFailed to open myfifo1 for reading!\n");
}
double x2, eps2;
char tab3[128], tab4[128];
//reading inputed parameters
read(pd2,tab3, sizeof(tab3));
read(pd2,tab4, sizeof(tab4));
//converting to floats
x2 = atof(tab3);
eps2 = atof(tab4);
printf("\nReceived initial data x=%f, eps = %f \n" , x2, eps2);
double singleTerm = 0;
int pd4;
char wyraz[128];
//opening myfifo2 for writing
pd4 = open("tmp/myfifo2", O_WRONLY);
if(pd4 == -1){
printf("\nfailed to open myfifo2\n");
}
do{
//calculate single term of Maclaurin series
singleTerm = Maclaurine(i,x2,eps2);
printf("\n%d. Series term = %lf\n", i,singleTerm);
sprintf(wyraz,"%lf",singleTerm);
if(write(pd4, wyraz, sizeof(wyraz)) == -1){
printf("\nfailed to send singleTerm to myfifo2\n");
}
i++;
//if its less than eps, loop ends
}while(singleTerm);
printf("\nFinal Result : %lf", FINAL_RESULT);
close(pd4);
close(pd2);
unlink("tmp/myfifo2");
}
//write data to myfifo1
write(pd, tab1, sizeof(tab1));
write(pd, tab2, sizeof(tab2));
close(pd);
unlink("tmp/myfifo1");
return 0;
}
そしてここでのコードの結果:
[email protected]:~$ gcc pipes.c -lm -o x
[email protected]:~$ ./x
X Value :
10
EPS Value :
0.001
10.000000
0.001000
[email protected]:~$
Failed to open myfifo1 for reading!
Received initial data x=0.000000, eps = 0.000000
failed to open myfifo2
1. Series term = 0.000000
failed to send singleTerm to myfifo2
Final Result : 0.000000
Current result = 0.000000
Failed to open myfifo1 for reading!
Received initial data x=0.000000, eps = 0.000000
failed to open myfifo2
1. Series term = 0.000000
failed to send singleTerm to myfifo2
Final Result : 0.000000
私はちょうどそれは、クラスの仕事だったので、私は、このタスクを失敗したことを追加したいです。私はここで何が起こっているのか理解したいので、投稿しています。 – Pawel
ありがとう、私はそれを修正します。 – Pawel
これで問題は解決しました。私はそれが今見栄えがいいと思う。 – Pawel