Проблема здесь в том, что дочерний процесс не ожидает поступления сообщения от функции startWorking()
, и из-за этого я получаю случайный символ в качестве вывода или иногда ничего.
Я отправляю массив символов из startWorking()
в канал и проверяю, что только родитель выполняет эту работу.
Одним из решений будет отправка сигнала из startWorking()
на дочерний процессор после записи в канал.
Но поведение функции read()
ожидает, когда канал примет сообщение, и только затем прочитает сообщение, но почему-то этого не происходит, или, возможно, возникла проблема при написании сообщения.
int main(int argc, char const *argv[])
{
pid_t pid;
pid = fork();
int mypipefd[2];
if (pid > 0)
{
if (pipe(mypipefd) == -1)
{
perror("Pipe failed\n");
exit(EXIT_FAILURE);
}
storeEngine(mypipefd);
}
else if(pid < 0)
{
perror("fork call failed \n");
exit(EXIT_FAILURE);
}
else
{
printf("I am the child \n");
printf("child: %d \n", getpid());
char message[6];
close(mypipefd[1]);
read(mypipefd[0], &message, 6);
close(mypipefd[0]);
printf("child read value:\n ");
printf("%s \n", message);
}
return 0;
}
void startWorking(int *mypipefd)
{
printf("%d \n" ,getpid());
//close(*mypipefd);
write(*(mypipefd+1), "hello", 6);
close(*(mypipefd+1));
}
Обратите внимание, что если я удалю два слэша за close(*mypipefd)
, программа никогда не завершится и там застрянет.