Ти-вызов функции в C не работает и не выполняется - PullRequest
0 голосов
/ 15 февраля 2019

Привет, я пишу оболочку linux на C. Я хочу перенаправить вывод как в файл, так и в терминал, и я обнаружил, что путь - это путь.Я зашел на man-страницу linux по tee и обнаружил, что tee можно использовать как вызов функции для вызова из C-программы.Итак, я написал

int size =tee(pipeends[1], 1,INT_MAX,SPLICE_F_NONBLOCK);

Но это просто не работает.он говорит

неявное объявление функции 'tee' [-Wimplicit-function-объявление] size = tee (pipeends [1], 1, INT_MAX, SPLICE_F_NONBLOCK);

Я много искал в Интернете, и все, что он возвращает, это как использовать команду tee в терминале, которую я знаю, используя tee.Но я хочу закодировать его в программе и не позволять пользователю вводить его явно.Я добавил заголовочные файлы:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <sys/stat.h>
#include< fcntl.h>

как часть моего кода оболочки linux.Я не знаю, использует ли tee некоторые другие заголовочные файлы или нет, но я не знаю.

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Страница руководства содержит необходимые шаги:

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <fcntl.h>

Это приведет к объявлению, которое:

ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);

Так что вы должны иметь возможностьнаписать программу для установки тройника на основе этой информации.Обратите внимание, что этот вызов специфичен для Linux, это не стандартная функция C (или POSIX, стандарт Unix, которому часто соответствует Linux).

0 голосов
/ 18 февраля 2019

Включите это:

#define _GNU_SOURCE
#include <fcntl.h>
ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);`

Третья строка - это та, которая удалит это предупреждение. (Это для меня)

Кроме того, если вы собираетесь использовать соединение () после тройника используйте следующие макросы:

ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags);

#ifndef SPLICE_F_MOVE
#define SPLICE_F_MOVE           0x01
#endif
#ifndef SPLICE_F_NONBLOCK
#define SPLICE_F_NONBLOCK       0x02
#endif
#ifndef SPLICE_F_MORE
#define SPLICE_F_MORE           0x04
#endif
#ifndef SPLICE_F_GIFT
#define SPLICE_F_GIFT           0x08
#endif

Надеюсь, это помогло.Я знаю, что срок истек :(

0 голосов
/ 15 февраля 2019

Кажется, вы не включили правильные заголовки в свой файл:

   #define _GNU_SOURCE         /* See feature_test_macros(7) */
   #include <fcntl.h>

Вы не упомянули _GNU_SOURCE в своем вопросе.Может тебе это нужно?

...