Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Именованные FIFO-каналы  (Прочитано 698 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн chempo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Именованные FIFO-каналы
« : 13 Ноября 2014, 17:07:45 »
Программа, автоматически определяющая свою функцию -- клиент или сервер -- по наличию коммуникационного ресурса: каждый экземпляр процесса производит поиск именованного канала (FIFO) с заранее известным именем. Если FIFO не найден, процесс создает его и начинает функционировать как сервер. Если FIFO найден, процесс открывает его и начинает функционировать как клиент. Функции сервера: занести в FIFO текущее время (формат можно выбирать произвольно) и ежесекундно его обновлять. Функции клиента: считывать текущее значения времени из FIFO и выводить его на консоль (однократно при запуске или в цикле).

Помогите! Как мне сиправить мой код, чтобы заработало??

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#define PIPENAME "lab5-pipe"

int server_mode;

static void catch_signal(int signal) {
if(signal == SIGINT){
if(server_mode)
unlink(PIPENAME);

exit(0);
}
}
 
int main(void) {
if (signal(SIGINT, catch_signal) == SIG_ERR) {
fprintf(stderr, "Can't set signal handler.\n");
exit(1);
}

if(mkfifo(PIPENAME, 0666) == 0){
server_mode = 1;
printf("server\n");
fflush(stdout);

int fd = open(PIPENAME, O_WRONLY);
time_t rawtime;
struct tm * timeinfo;
char buf[100];

while(1){
time(&rawtime);
timeinfo = localtime(&rawtime);
strcpy(buf, asctime(timeinfo));

write(fd, buf, strlen(buf));
sleep(1);
}
}else{
server_mode = 0;
fprintf(stdout, "client\n");
fflush(stdout);

int fd = open(PIPENAME, O_RDONLY);
char buf[100];
while(read(fd, &buf, 100)!=0){
printf("%s\n", buf);
fflush(stdout);
}
}

return 0;
}
« Последнее редактирование: 13 Ноября 2014, 17:10:11 от chempo »

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Re: Именованные FIFO-каналы
« Ответ #1 : 14 Ноября 2014, 13:45:44 »
Код: (C) [Выделить]
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#define PIPENAME "lab5-pipe"

int server_mode;


static void catch_exit_signal(int sig_num) {
if (server_mode) {
unlink(PIPENAME);
}
exit(0);
}

static void reg_exit_signal(int sig_num) {
if (signal(sig_num, catch_exit_signal) == SIG_ERR) {
fprintf(stderr, "Can't set signal handler.\n");
exit(1);
}
}

static void ignore_signal(int sig_num) {
signal(sig_num, SIG_IGN);
}
 
int main(void) {

reg_exit_signal(SIGINT);
reg_exit_signal(SIGTERM);
ignore_signal(SIGPIPE);

if(mkfifo(PIPENAME, 0666) == 0){
server_mode = 1;
printf("server\n");
fflush(stdout);

int fd = open(PIPENAME, O_WRONLY);
time_t rawtime;
struct tm * timeinfo;
char* buf;

while(1){
time(&rawtime);
timeinfo = localtime(&rawtime);
buf = asctime(timeinfo);

write(fd, buf, strlen(buf));
sleep(1);
}
}else{
server_mode = 0;
fprintf(stdout, "client\n");
fflush(stdout);

int fd = open(PIPENAME, O_RDONLY);
char buf[25];
while(read(fd, &buf, 25)!=0){
printf("%s", buf);
fflush(stdout);
}
}

return 0;
}

https://ru.wikipedia.org/wiki/SIGPIPE

 

Страница сгенерирована за 0.016 секунд. Запросов: 22.