У меня есть эта простая программа, но когда я хотел проверить значение, которое я получаю от ребенка, он возвращает 1995694080 или аналогичные числа.Я немного сбит с толку, как я могу добиться, чтобы получить реальное значение сообщения?Похоже, я получаю какое-то случайное значение мусора из другого места, где я не должен.Я сделал этот канал отправителем на основе учебника, и он в основном работает только тогда, когда я отправляю данные от потомка, это не удается.Любая идея или предложение?
int pipefd[2];
int main()
{
signal(SIGTERM, handler);
signal(SIGUSR1, finishedOrder);
pid_t pid;
if (pipe(pipefd) == -1)
{
perror("Error while making pipe.\n");
exit(1);
}
pid = fork();
if (pid < 0)
{
perror("Fork error.\n");
exit(1);
}
if (pid > 0)
{
employer(pid, 4, false);
}
else
{
employee(getppid());
}
}
void employer(pid_t pid, int id, bool two)
{
int rec;
printf("[Szülő]: várok egy szerelő csapatra! \n");
sleep(1);
kill(pid, SIGTERM);
pause();
if (two)
{
/.../
}
else
{
printf("[Szülő]: dolgozz a %d. feladaton\n", id);
close(pipefd[0]);
write(pipefd[1], &id, sizeof(id)); //this is works.
close(pipefd[1]);
sleep(1);
kill(pid, SIGTERM);
pause();
kill(pid, SIGTERM);
}
pause();
close(pipefd[1]);
read(pipefd[0], &rec, sizeof(rec));
printf("%d\n", rec); // here I get the strange value
if (rec == 4)
{
printf("[Szülő]: feljegyeztem a módosításokat.\n");
if (two)
{
/**/
}
else
{
/**/
}
}
}
void employee(pid_t emp)
{
int jobs[2];
pause();
printf("[Gyerek]: munkára jelentkezek\n");
sleep(1);
kill(emp, SIGTERM);
pause();
close(pipefd[1]);
read(pipefd[0], &jobs[0], sizeof(jobs[0]));
close(pipefd[0]);
printf("[Gyerek]: elkezdek dolgozni a %d. feladaton.\n", jobs[0]);
sleep(1);
kill(emp, SIGUSR1);
pause();
sleep(1);
read(pipefd[0], &jobs[1], sizeof(jobs[1]));
if (jobs[1] != 0)
{
printf("[Gyerek]: elkezdek dolgozni a %d. feladaton.\n", jobs[1]);
sleep(1);
kill(emp, SIGUSR1);
}
close(pipefd[0]);
fflush(NULL);
int msg = 4;
printf("%d\n", msg);
write(pipefd[1], &msg, sizeof(msg));
close(pipefd[1]);
sleep(1);
kill(emp, SIGTERM);
}
void handler(int signum)
{
}
void finishedOrder()
{
}