ч и т печатают только 1 раз ... почему так? - PullRequest
0 голосов
/ 08 августа 2010
#include <stdio.h>
//#include <conio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h> 
#include <sys/types.h>
int t_array[100];
int h_array[100];
int c,h_comp=0,race_length=0,o=0,i=0,Ti=0;

void cursor(int y)
{
 int i;
 printf("%c[%d;%df",0x1B,y,o);
}
void turtle_fun()
{ 
 int Ti=0;
 while(h_comp!=1&&Ti<=race_length-1)
 {
  cursor(10);  
  printf("t      ");
  fflush(stdout);  
  Ti++;
  sleep(3);
 }
}


void hare_fun(int rh[])
{
 int k;int i=0;
 char pos_h;
 close(rh[0]);
 while(c!=1&&i<=race_length-1)
 {

  cursor(5);
  printf("h      ");
  fflush(stdout);
  i++;
  sleep(1);
 }
 h_comp=1;
}



void god_fun(pid_t id)
{

}


void report_fun(int rh[],int rg[],int rt[])
{ 
 int k,m,pos;
 int pos_h,pos_t;
 close(rh[1]);
 if(k=fork()==0)
 hare_fun(rh);
 else
 {
  if(fork()==0)
  turtle_fun();

 }

}


void main()
{
 int rg[2],rh[2],rt[2],gh[2],gt[2],ht[2];
 int child_id;
 pid_t cpid;
 printf("what is the length of the race");
 scanf("%d",&race_length);
 cpid=fork();
 if(cpid==0)
 {
  pipe(rg);
  pipe(rh);
  pipe(rt);
  report_fun(rh,rg,rt);
 }
 else
 {  
  pipe(gh);
  pipe(gt);
  god_fun(cpid);
 }

} 

1 Ответ

0 голосов
/ 08 августа 2010

int c, h_comp = 0, race_length = 0, o = 0, i = 0, Ti = 0;

После того, как сегменты данных fork () тоже будут разветвлены, и переменные перестанут делиться, что означает:

void hare_fun(int rh[])
{
 /*...*/
 h_comp=1;
}

не повлияет на это

void turtle_fun()
{ 
 while(h_comp!=1 /* ... */)
 {
   /* ... */
 }
}

работает в другом процессе.

Чтобы получить часть памяти, совместно используемой процессами fork ():

  • поместите все поля, которые вы хотите использовать в структуре, например, struct the_struct
  • добавить новую глобальную переменную - указатель на структуру,
  • выделяет память для структуры, используя mmap(0, sizeof(struct the_struct), PROT_READ|PTOT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); где-то на main() перед любым fork().
  • память, созданная таким образом, будет разделена после fork() с.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...