Сделать что, printf работающий? Давно уже сделано. Суть вопроса не понятна, в инструкции на компилятор написано как это сделать. Приводить же 100% листинги смысла нет наверное. Только через функции _GNU_ libc? Тоже можно, но это ни разу не на пике -- там нет GNU libc, там библиотека фирмы Dinkumware. На PC запросто, пример перенаправления stdin, stdout и stderr через функции reader и writer, при этом если их file descriptor соответствует COM-порту, то происходит не вызов read/write функций, а специфических функций uart_read и uart_write. Зачем и почему так -- объяснять не буду, там слишком многоэтажная архитектура. Работает только для GNU libc:
ssize_t __read(int fd, void *buf, size_t count);
ssize_t __write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count)
{
if (fd>=UART_FILENO_MIN && fd<=UART_FILENO_MAX)
return uart_read(fd, buf, count);
else
return __read(fd, buf, count);
}
ssize_t write(int fd, const void *buf, size_t count)
{
if (fd>=UART_FILENO_MIN && fd<=UART_FILENO_MAX)
return uart_write(fd, buf, count);
else
return __write(fd, buf, count);
}
static ssize_t reader(void *cookie, char *buf, size_t size)
{
return read((int)cookie, buf, size);
}
static ssize_t writer(void *cookie, const char *buf, size_t size)
{
return write((int)cookie, buf, size);
}
static ssize_t seeker(void *cookie, off64_t *pos, int whence)
{
off_t retval;
retval=lseek((int)cookie, *pos, whence);
if (retval==(off_t)-1) return -1;
*pos=retval;
return 0;
}
static int cleaner(void *cookie)
{
return close((int)cookie);
}
cookie_io_functions_t uart_io = {
.read = reader,
.write = writer,
.seek = seeker,
.close = cleaner
};
void xxx_init(void)
{
int stdin2, stdout2, stderr2;
stdin2=dup(STDIN_FILENO);
stdout2=dup(STDOUT_FILENO);
stderr2=dup(STDERR_FILENO);
fclose(stdin), fclose(stdout), fclose(stderr);
dup2(stdin2, STDIN_FILENO);
dup2(stdout2, STDOUT_FILENO);
dup2(stderr2, STDERR_FILENO);
close(stdin2), close(stdout2), close(stderr2);
stdin = fopencookie((void*)STDIN_FILENO, "r", uart_io);
setvbuf(stdin, NULL, _IONBF, 0);
stdout = fopencookie((void*)STDOUT_FILENO, "a", uart_io);
setvbuf(stdout, NULL, _IONBF, 0);
stderr = fopencookie((void*)STDERR_FILENO, "a", uart_io);
setvbuf(stderr, NULL, _IONBF, 0);
}
/* в программе везде вместо fdopen используется эта FDOPEN */
FILE *FDOPEN(int fd, const char *mode)
{
FILE *retval;
/* retval=fdopen(fd, "a"); */
retval=fopencookie((void*)(uintptr_t)fd, mode, uart_io);
assert(retval!=NULL);
setvbuf(retval, NULL, _IONBF, 0);
return retval;
}
[ZX]