Что я могу использовать кроме usleep в современной среде POSIX? - PullRequest
4 голосов
/ 25 сентября 2011

Я довольно плохо знаком с C, но пишу небольшое многопоточное приложение. Я хочу ввести задержку в поток. Я использовал «usleep», и поведение - это то, что я хочу, но оно генерирует предупреждения в C99.

неявное объявление функции "usleep"

Это всего лишь предупреждение, но это беспокоит меня. Я гуглил ответ, но все, что я мог найти, это подход «время-цикл / таймер», который, казалось, требовал значительных ресурсов процессора.

EDIT:

Мои включения:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>

И я вызываю компилятор с:

c99 program.c -Wall -pedantic -W -lpthread

РЕДАКТИРОВАТЬ # 2:

Я создал новый файл, который содержит:

#include <unistd.h>

int main(void) {
    usleep(10);
}

И я все еще получаю предупреждение.

РЕДАКТИРОВАТЬ # 3: Как и предполагалось, я обновил текст вопроса.

Ответы [ 5 ]

5 голосов
/ 29 сентября 2011

Проблема в том, что вы используете стандартный компилятор C99, но пытаетесь получить доступ к расширениям POSIX.Чтобы выставить расширения POSIX, вы должны, например, определить _POSIX_C_SOURCE до 200809L (для текущего стандарта).Например, эта программа:

#include <time.h>

int main(void) {
        struct timespec reqtime;
        reqtime.tv_sec = 1;
        reqtime.tv_nsec = 500000000;
        nanosleep(&reqtime, NULL);
}

будет правильно скомпилирована и будет ждать 1,5 секунды (1 секунда + 500000000 наносекунд) с помощью следующей команды компиляции:

c99 main.c -D _POSIX_C_SOURCE=200809L

Необходимо определить макрос _POSIX_C_SOURCEс соответствующим значением для доступных расширений POSIX.

Кроме того, параметры -Wall, -pedantic и -W не определены для команды POSIX c99, они больше похожи на команды gcc (если они работаюттогда в вашей системе это нормально, просто имейте в виду, что они не переносимы на другие системы POSIX).

4 голосов
/ 25 сентября 2011

Вы, вероятно, используете современную систему POSIX:

POSIX.1-2008 удаляет спецификацию usleep ().

В моей системе (linux) естьподробное объяснение макросов, которые должны быть установлены для возврата этой функции.Но вы должны просто следовать совету, который уже дал zvrba, вместо этого используйте nanosleep.

1 голос
/ 25 сентября 2011

со страницы справочника: эта функция устарела. Вместо этого используйте nanosleep.

0 голосов
/ 25 сентября 2011

Был ли у вас #include <unistd.h>?

И вместо этого вы можете использовать некоторые из подобных методов: nanosleep () для наносекунд и sleep () для секунд.Или другой способ мог бы использовать clock (), но я думаю, что это больше тратит процессор.

0 голосов
/ 25 сентября 2011

неявное объявление функции "usleep"

Это предупреждение обычно означает, что вы #include не выбрали правильный заголовочный файл, в данном случае unistd.h.

...