Привет всем.
Программа-родитель, запускает потомка, связывая его каналом, через который потомок возвращает результат (пару символов). В качестве синхронизации у меня сигналы. Но родитель может считать данные с канала только после завершения потомка.. Должно быть так: - родитель запускает потомка - потомок ничего не делает
- родитель посылает сигнал - потомок в ответ присылает данные и снова засыпает
- родитель считывает данные, смотрит что бы все ОК и посылает потомку сигнал - умри - потомок завершается
Наверное, вывод у потомка буферезируется, поэтому только при его завершении выполняется запись в канал(такое у меня ощущение:) )
Проблема в этом и есть, что данные не считываются когда надо.
Родитель:
#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) потомок завершается, родитель считывает все верно..
Насчет реализации такой синхронизации не критикуйте, все так должно быть.. Это лаба :)