Выполнение команды tr в очереди? - PullRequest
1 голос
/ 27 декабря 2011

У меня есть серверное и клиентское приложение, использующее очереди IPC.Сервер (на данный момент) просто отправляет обратно текст, полученный от клиента.Я хотел бы, чтобы сервер изменил буквы в сообщении с нижнего на верхний регистр.Мне интересно, как этого добиться.Должен ли я создать трубу?Я думаю о том, чтобы «взять» текст из полученной очереди, выполнить для него команду tr и отправить обратно клиенту.Но если использовать канал, откуда мне взять файловые дескрипторы?Я имею в виду, int fds[2]; и pipe(fds); дают мне канал, но он не работает с двумя массивами символов, такими как:

int fds[2];
pipe(fds);
char a[100];
char b[100];
fds[0] = open(a,O_RDOLNY);
fds[1] = open(b,O_WRONLY);

Как я могу выполнить команду tr для текста, содержащегося в очереди сообщений

1 Ответ

1 голос
/ 27 декабря 2011

Я бы не стал fork программой для этого:

p = str;
while (*p) {
    *p = toupper(*p);
    p++;
}

Если серьезно, вам, вероятно, следует использовать popen, который автоматически (и надежно) разветвляется и использует канал для настройки FILE * для вас.

FILE *cmd = popen("tr ... ", "r");

А затем просто fgets из него (не забудьте pclose это).К сожалению, в Linux вы не можете одновременно писать и читать во всплывающий файл (вы можете это сделать во FreeBSD).

EDIT

Поскольку это вопрос домашнего задания (и, честно говоря, потому что я нене думаю, что это просто - сделать это полностью правильно в это время ночи), вот что на самом деле делает popen

  • Создание канала
  • Форк оболочки, которая будет работатькоманда
  • Возвращает FILE * (возможно, через fdopen)

Последний шаг действительно необязателен, так как вы всегда можете прочитать непосредственно из файлового дескриптора.

...