Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ожиданиеи

2.2K
24 ноября 2009 года
S@tana
53 / / 15.10.2009
Нужно сделать. чтобы родительский процесс ждал завершения процесса-потомка, а потом продолжал свою работу.
Весь инет уже облазил и ничего дельного не нашол...только мануалы, а по ним ниче не понятно.
Вот код проги.

Код:
#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;
}
34K
24 ноября 2009 года
muturgan
96 / / 01.10.2009
Цитата: S@tana

 
Код:
else {     //здесь делается какая то чушь
      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;
}
2.2K
26 ноября 2009 года
S@tana
53 / / 15.10.2009
Переписал код с учетом совета.
Код:
#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;
}

Теперь выдает Ошибку сегментации (раньше в файл не писало).
Подскажите в чем проблеммы плз.
34K
26 ноября 2009 года
muturgan
96 / / 01.10.2009
Добавьте exit(0) после каждого fclose() во всех дочерних процессах, иначе дочерние процесс не завершатся а будут работать параллельно с родительским. Ошибка сегментации ещё может возникнуть, если Вы программу без параметров запускаете (там есть обращение к argv[1] и argv[2], которые могут равняться нулю).
2.2K
26 ноября 2009 года
S@tana
53 / / 15.10.2009
Спасибо, уже все сделал... Немного по другому но все равно спасибо за советы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог