Я немного запутался в том, как правильно использовать pipe() для передачи целочисленных значений между двумя процессами.
В моей программе я сначала создаю канал, затем я его развожу. Я предполагаю, что у меня есть "Два" трубы?
Из того, что я понимаю, это мое задание. Мой родитель проходит цикл for, проверяя целое значение "i" для определенной операции, увеличивает значение счетчика и сохраняет значение в массив. После каждой проверки мой родитель должен передать целочисленное значение "i" моему ребенку через канал. Затем мой ребенок использует это целочисленное значение, выполняет некоторую проверку значения и должен увеличить переменную count и сохранить результат в массиве [shared?]. В итоге; ребенок должен вернуть его окончательный счет родителям, который затем распечатывает два счета и "общий" массив.
- > Я не уверен, что мне нужно иметь общий массив или вообще сохранять результаты. Мне могут понадобиться только подсчеты - домашнее задание было неоднозначным, и я жду ответа от профессора. Также; могу ли я сделать общий массив между процессами? Это звучит как начало какой-то проблемы для меня.
- > Вот мои вопросы: Один; как использовать каналы для целых чисел? Я видел их только для массивов символов, и предыдущие ответы не кажутся возможными или законными..? Я не уверен. Не было разрешения, которое я мог бы найти на нем.
- > Как использовать однонаправленный канал для передачи целых чисел ребенку? И вернуть ребенка что-то? Я не уверен, как я могу... различать две трубы. Я "знаю" [или думаю, что знаю], что мне нужно закрыть одну неиспользованную часть каждого канала, чтобы избежать "некоторой неопределенной проблемы".
Извините за немые вопросы; Я еще не преподавал процессы (кроме вилки) или труб (вообще) в этом классе, поэтому я не уверен, с чего начать!
Вот части моего кода - это некрасиво, и это не работает, и я этого не ожидаю. Это больше заполнителя оболочки. Как только я выясню, как использовать трубку, я, вероятно, сделаю код понятным.
int main(void)
{
int fd[2];
pid_t childpid;
pid_t parentpid;
int i;
int threecount = 0;
int fivecount = 0;;
int results [MAXSIZE];
parentpid = getpid(); //Get current process ID number
pipe(fd);
childpid = fork();
if(childpid == 0){
close(fd[0]); //Closing this for some other reason
}
int j = 0;
if(childpid > 0)
close(fd[1]); //Closing this for some reason
if( childpid == -1 )
{
perror("Failed to fork\n");
return 1;
}
if (childpid > 0)
{
for(i = 1; i < MAXSIZE;i++)
{
if(i % 5 == 0)
{
fivecount++;
i = results[j];
j++;
wait(NULL);
}
}
}
else if (childpid == 0)
{
if(i % 3 == 0) //This i here should probably be the i value above, piped to the child
{
threecount++;
i = results[j]; //This should be part of th pipe
j++; //Trying to keep count of that shared array, not really the right way to do it though.
}
}
printf("%d %d \n", fivecount,threecount);
return 0;
}