LINUX.ORG.RU

Именованный канал на с++

 


0

1

Привет,

Пытаюсь отдавать команды с помощью именованного канала mkfifo на с++.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int main()
{
   int client_to_server;
   char myfifo[] = "in";

   char str[BUFSIZ];
   while(1)
   {
	   printf("Input message to serwer: ");
	   scanf("%s", str);

	   client_to_server = open(myfifo, O_WRONLY);
	   write(client_to_server, str, sizeof(str));

           if(strcmp("exit",str) == 0)
		   break;
   }
   close(client_to_server);

   /* remove the FIFO */
   printf("done!\n");

   return 0;
}

принмает команды gdb

 $ gdb <in >out &

где in это именованный канал а out обычный файл.

При запуске с++ программы выполняется только одна первая команда, дальше команды не выполняются. Что делаю не так?

open() в цикле, например.

AptGet ★★★
()

scanf() небезопасный, write(..., sizeof(str)) будет писать вместе с командой мусор

AptGet ★★★
()

1. Что за мусор м.б. в конце str никто не знает. Лучше strlen чем sizeof. Иначе, в частности, будут добавлятся огрызки предыдущих вводов.

2. Зачем делать open многократно? Перед циклом бы хватило.

3. scanf в строку \n не вставляет => все будет добавлено как одна дурно организованная строка. Либо добавлять \n в строку, либо писать отдельно, либо fprintf (fopen/fdopen и т.п.).

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