#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
using namespace std;
int fakt(int arg) // Факториал
{
int res=1;
for (int i=1;i<=arg;i++)
{
res*=i;
}
return res;
}
int pow(int c,int n)// Степень
{
int res=1;
for (int i=1;i<=n;i++)
{
res*=c;
}
return res;
}
int main(int argc, char *argv[])
{
int n,k,n_k;
int k_fakt,n_fakt;
int n_f,k_f,step;//Процессы
///////////////////////////////
int status;
int pid,pid1,pid2;
///////////////////////////////
FILE *tmp1,*tmp2,*tmp3;
n=atoi(argv[1]);
k=atoi(argv[2]);
cout<<n<<" "<<k<<endl;
n_f=fork();
if (n_f==0){
cout<<"----------------"<<endl;
n_fakt=fakt(n);
tmp1=fopen("tmp1.txt","w");
fprintf(tmp1,"%d",n_fakt);
fclose(tmp1);
cout<<"n!= "<<n_fakt<<endl;
n_fakt=0;
}
else { //здесь делается какая то чушь
while (pid != n_f)
{
pid=waitpid(-1,&status, 0);
cout<<"Fork="<<n_f<<" | Waitpid="<<pid<<endl;
}
}
k_f=fork();
if (k_f==0){
k_fakt=fakt(k);
tmp1=fopen("tmp2.txt","w");
fprintf(tmp2,"%d",k_fakt);
fclose(tmp2);
k_fakt=0;
}
else {
while (pid1 != k_f){
pid1=waitpid(-1,&status, 0);
cout<<"Fork="<<k_f<<" | Waitpid="<<pid<<endl;
}
}
step=fork();
if (step==0){
int step;
step=n-k;
n_k=pow(n,step);
tmp3=fopen("tmp3.txt","w");
fprintf(tmp3,"%d",n_k);
fclose(tmp3);
n_k=0;
}
else {
while(pid2!=step)
{
pid2=waitpid(-1,&status, 0);
cout<<"Fork="<<step<<" | Waitpid="<<pid2<<endl;
}
}
tmp1=fopen("tmp1.txt","r");
tmp2=fopen("tmp2.txt","r");
tmp3=fopen("tmp3.txt","r");
fscanf(tmp1,"%d",&n);
fscanf(tmp2,"%d",&k);
fscanf(tmp3,"%d",&n_k);
float R;
cout<<"n= "<<n<<" k= "<<k<<" n^k= "<<n_k<<endl;
R=(n-k)/n_k;
cout<<"Result= "<<R<<endl;
fclose(tmp1);fclose(tmp2);fclose(tmp3);
unlink("tmp1.txt");unlink("tmp2.txt");unlink("tmp3.txt");
return 0;
}
Ожиданиеи
Весь инет уже облазил и ничего дельного не нашол...только мануалы, а по ним ниче не понятно.
Вот код проги.
Код:
Цитата: S@tana
Код:
else { //здесь делается какая то чушь
while (pid != n_f)
{
pid=waitpid(-1,&status, 0);
cout<<"Fork="<<n_f<<" | Waitpid="<<pid<<endl;
}
}
while (pid != n_f)
{
pid=waitpid(-1,&status, 0);
cout<<"Fork="<<n_f<<" | Waitpid="<<pid<<endl;
}
}
Побробуйте заменить этот кусок кода на
Код:
else
{
pid = wait( &status );
cout<<"Fork="<<n_f<<" | Wait="<<pid<<endl;
}
{
pid = wait( &status );
cout<<"Fork="<<n_f<<" | Wait="<<pid<<endl;
}
Код:
#include <iostream>
#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
using namespace std;
int fakt(int arg) // faktorial
{
int res=1;
for (int i=1;i<=arg;i++)
{
res*=i;
}
return res;
}
int pow(int c,int n)// stepen
{
int res=1;
for (int i=1;i<=n;i++)
{
res*=c;
}
return res;
}
int main (int argc, char *argv[])
{
pid_t proc1, proc2, proc3;
int n_faktor,k_faktor,n_pow;
int status;
int n,k;
n=atoi(argv[1]);
k=atoi(argv[2]);
cout<<n<<" "<<k<<endl;
FILE *tmp1,*tmp2,*tmp3;
proc1=fork();
if (proc1==0){
int result;
result=fakt(n);
tmp1=fopen("Nfaktor.txt","w");
fprintf(tmp1,"%d",result);
fclose(tmp1);
}
else
{proc1=wait(&status);}
proc2=fork();
if (proc2==0)
{
int result;
result=fakt(k);
tmp2=fopen("Kfaktor.txt","w");
fprintf(tmp2,"%d",result);
fclose(tmp2);
}
else
{proc2=wait(&status);}
proc3=fork();
if (proc3==0)
{
int result;
int step=n-k;
result=pow(n,step);
tmp3=fopen("N_v_setep_(n-k).txt","w");
fprintf(tmp3,"%d",result);
fclose(tmp3);
}
else
{proc3=wait(&status);}
cout<<"------------------------------"<<endl;
tmp1=fopen("Nfaktor.txt","r");
fscanf(tmp1,"%d",&n_faktor);
tmp2=fopen("Kfaktor.txt","r");
fscanf(tmp2,"%d",&k_faktor);
tmp3=fopen("N_v_step_(n-k).txt","r");
fscanf(tmp3,"%d",&n_pow);
cout<<n_faktor<<" "<<k_faktor<<" "<<n_pow<<endl;
float resultat;
resultat=(n_faktor - k_faktor)/n_pow;
cout<<"Resul'tat= "<<resultat;
fclose(tmp1);fclose(tmp2);fclose(tmp3);
return 0;
}
#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
using namespace std;
int fakt(int arg) // faktorial
{
int res=1;
for (int i=1;i<=arg;i++)
{
res*=i;
}
return res;
}
int pow(int c,int n)// stepen
{
int res=1;
for (int i=1;i<=n;i++)
{
res*=c;
}
return res;
}
int main (int argc, char *argv[])
{
pid_t proc1, proc2, proc3;
int n_faktor,k_faktor,n_pow;
int status;
int n,k;
n=atoi(argv[1]);
k=atoi(argv[2]);
cout<<n<<" "<<k<<endl;
FILE *tmp1,*tmp2,*tmp3;
proc1=fork();
if (proc1==0){
int result;
result=fakt(n);
tmp1=fopen("Nfaktor.txt","w");
fprintf(tmp1,"%d",result);
fclose(tmp1);
}
else
{proc1=wait(&status);}
proc2=fork();
if (proc2==0)
{
int result;
result=fakt(k);
tmp2=fopen("Kfaktor.txt","w");
fprintf(tmp2,"%d",result);
fclose(tmp2);
}
else
{proc2=wait(&status);}
proc3=fork();
if (proc3==0)
{
int result;
int step=n-k;
result=pow(n,step);
tmp3=fopen("N_v_setep_(n-k).txt","w");
fprintf(tmp3,"%d",result);
fclose(tmp3);
}
else
{proc3=wait(&status);}
cout<<"------------------------------"<<endl;
tmp1=fopen("Nfaktor.txt","r");
fscanf(tmp1,"%d",&n_faktor);
tmp2=fopen("Kfaktor.txt","r");
fscanf(tmp2,"%d",&k_faktor);
tmp3=fopen("N_v_step_(n-k).txt","r");
fscanf(tmp3,"%d",&n_pow);
cout<<n_faktor<<" "<<k_faktor<<" "<<n_pow<<endl;
float resultat;
resultat=(n_faktor - k_faktor)/n_pow;
cout<<"Resul'tat= "<<resultat;
fclose(tmp1);fclose(tmp2);fclose(tmp3);
return 0;
}
Теперь выдает Ошибку сегментации (раньше в файл не писало).
Подскажите в чем проблеммы плз.
Добавьте exit(0) после каждого fclose() во всех дочерних процессах, иначе дочерние процесс не завершатся а будут работать параллельно с родительским. Ошибка сегментации ещё может возникнуть, если Вы программу без параметров запускаете (там есть обращение к argv[1] и argv[2], которые могут равняться нулю).
Спасибо, уже все сделал... Немного по другому но все равно спасибо за советы.