LINUX.ORG.RU

c функция добавления в конвеер

 ,


0

1

Доброго времени суток! Необходимо реализовать курсач с процессами, которые обмениваются данными через конвеер, FIFO,разделяемую память и прочее. С-но, работа и так объемная и хотелось бы часть кода вынести в функции. В связи с этим задумался о том, как бы сделать функции записи-чтения из pipe. Пока надумал вот что:

void init_pipe()// создаем конвеер
{
	 if(pipe(fd)<0)
    {
      fprintf(stderr, "Ошибка создания конвеера! \n");
      exit(0);
    }
    else
    {
    	fprintf(stderr, "Конвеер успешно создан! \n");
    }
}

void save_pipe(char *info)
{
	close(fd[0]);
	int size = write(fd[1], info, strlen(info));

	close(fd[1]);
}

char* load_pipe()
{
	close(fd[1]);
	char buffer[ELEMENT_SIZE];
	char *temp;
	read(fd[0], buffer, ELEMENT_SIZE);

	strcpy(temp, buffer);

	close(fd[0]);

	return temp;
}

пытаюсь это дело заставить так:

        init_pipe();
	save_pipe("234");

	printf("%s", load_pipe());

Однако мне выдается ошибка сегментирования ядра. Понимаю, что тема скорее всего ламерская, однако раньше никогда не занимался такими вещами и всегда предпочитал высокоуровневые функции. Может кто подскажет, как сделать задуманное, или хотя-бы уменьшить объем кода, чтобы не пришлось каждый раз закрывать файлы, записывать-считывать данные, проверять правильно ли они записаны-считаны через значение, возвращаемое read-write, и т.п.

Буду очень благодарен за помощь



Последнее исправление: gwyllum (всего исправлений: 1)

Ответ на: комментарий от Begemoth

т.е. так?

char *temp=(char*)malloc(sizeof(char)*ELEMENT_SIZE);
забавно, ошибка перестала выдаваться, но все равно не печатается извлеченное значение

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

malloc

В твоем случае лучше calloc, он тебе ещё и выделенный буфер обнулит.

извлеченное значение

А оно извлеклось? Ты результат read проверял? А почему ты сначала в save_pipe закрываешь дескриптор, а потом в load_pipe пытаешься из него читать?

Begemoth ★★★★★
()
Ответ на: комментарий от gwyllum

Более того вывод в консоль в функции load_pipe вида fprintf(stderr, «1111»); ничего не выводит, хотя аналогичная конструкция в функции save_pipe прекрасно работает.

gwyllum
() автор топика
Ответ на: комментарий от Begemoth

А почему ты сначала в save_pipe закрываешь дескриптор, а потом в load_pipe пытаешься из него читать?

Стырил из примера, там перед началом записи закрывается другой файл и наоборот:

 /* Parent process */

      close(fd[0]);

      size = write(fd[1], "Hello, world!", 14);

      if(size != 14){
        printf("Can't write all string to pipen");
        exit(-1);
      }

      close(fd[1]);
      printf("Parent exitn");

   } else {

      /* Child process */   

      close(fd[1]);
      size = read(fd[0], resstring, 14);

      if(size < 0){
         printf("Can't read string from pipen");
         exit(-1);
      }

      printf("Child exit, resstring:%sn", resstring);

      close(fd[0]);
gwyllum
() автор топика
Ответ на: комментарий от gwyllum

В твоем случае я бы очень советовал сначала хотя бы немножко поучить Си, прежде чем браться за пайпы и прочие сложные вещи. Тем более, что ты студент, и должен учиться сам, а не просить, чтобы за тебя решили. Касательно же твоего вопроса: ты перед записью закрываешь читающий конец пайпа; очевидно, что потом ты не можешь из него ничего прочитать. И еще, write(fd[1], info, strlen(info)) - ты теряешь \0 в конце строки, потом при выводе можешь поиметь много хлопот. Сделай strlen(info)+1.

ddos3
()
Ответ на: комментарий от gwyllum

Стырил из примера

Тьфу, гадость какая. Ты хотя бы попытался понять, что значит код в том примере, или просто скопировал не глядя, и когда он не заработал побежал на ЛОР, чтобы кто-нибудь другой за тебя сделал домашку?

ddos3
()
Ответ на: комментарий от Begemoth

Огромное спасибо. Видео правда не смотрел, но думаю, там что-то хорошее, судя по Вашей аватарке.

Нашел похожий пример http://www.gnu.org/software/libc/manual/html_node/Creating-a-Pipe.html

Огромное спасибо дружелюбному сообществу!

gwyllum
() автор топика
Ответ на: комментарий от Begemoth

+

$ sudo apt-get install brain knp-tupe rochkind-aup
$ cat knp-tupe > /dev/brain
$ cat rochkind-aup > /dev/brain

и как ни странно

Unix programmer Manual, Volume 2a 2b - пользительное

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)
Ответ на: комментарий от Begemoth

Фига, качественный ролик :) Это наш военком такое делать научился или это инициатива каких то сторонних сил?

batbko
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.