LINUX.ORG.RU

Сообщения Kot

 

Pipe

Привет всем.

Программа-родитель, запускает потомка, связывая его каналом, через который потомок возвращает результат (пару символов). В качестве синхронизации у меня сигналы. Но родитель может считать данные с канала только после завершения потомка.. Должно быть так: - родитель запускает потомка - потомок ничего не делает

- родитель посылает сигнал - потомок в ответ присылает данные и снова засыпает

- родитель считывает данные, смотрит что бы все ОК и посылает потомку сигнал - умри - потомок завершается

Наверное, вывод у потомка буферезируется, поэтому только при его завершении выполняется запись в канал(такое у меня ощущение:) )

Проблема в этом и есть, что данные не считываются когда надо.

Родитель:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <wait.h>
#include <fcntl.h>

extern int errno;
extern char **environ;

float res[2];
int *fd = new int[2];

#define BUF_SIZE 1024

int main(int argc, char **argv){

  if(argc==1){
    printf("\t1 paramete - digit.\n");
    exit(-1);
  }

  pipe(fd);
  perror("pipe");

  pid_t p_cos,p_pi;
  

// process get cos(x)
  switch(p_cos = fork()){
	case 0:
		close(fd[0]);
		dup2(fd[1],1);
		execl("~/Рабочий стол/lb4/bin/m_cos", "/",argv[1], NULL);
		perror("execl");
		exit(-1);
		break;
	case -1:
		perror("fork");
		exit(-1);
		break;
  }
 

  kill(p_cos,SIGUSR1);//Run
  perror("kil");
  printf("PId= %d\n",p_cos);

  close(fd[1]);

  char *buf = new char[BUF_SIZE];
  
  int i;
  
  i = read(fd[0],buf,BUF_SIZE);
  perror("read");
  printf("%s\ni=%d\n",buf,i);

return 0;
}

Потомок:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
#include <wait.h>
#include <string.h>

char *arg_1;

void signal_run(int signum){ 

  float x=atof(arg_1);

  printf("%f\n",cos(x));

}

void signal_exit(int sig){

  exit(0);
  
}

int main(int argc, char **argv){

  arg_1 = argv[1];
  signal(SIGUSR1, signal_run); //Run process
  signal(SIGUSR2, signal_exit); //Exit process

  while (true){
	sleep(-1);
  }
  
return 0;
}

Компилю, запускаю, родитель зависает на

i = read(fd[0],buf,BUF_SIZE);

через командную строку посылаю kill -12 pid_потомка (-12 = SIGUSR2) потомок завершается, родитель считывает все верно..

Насчет реализации такой синхронизации не критикуйте, все так должно быть.. Это лаба :)

Kot
()

RSS подписка на новые темы