Eu tenho algum código fonte que foi compilado no Windows. Estou convertendo para rodar no Red Hat Linux.
O código fonte incluiu o <windows.h>
arquivo de cabeçalho e o programador usou a Sleep()
função para aguardar um período de milissegundos. Isso não vai funcionar no Linux.
No entanto, eu posso usar a sleep(seconds)
função, mas isso usa inteiro em segundos. Não quero converter milissegundos em segundos. Existe uma função de suspensão alternativa que eu possa usar com a compilação do gcc no Linux?
sleep(/*seconds*/)
em<unistd.h>
obras, mas se eu usar comprintf("some things")
sem\n
, não funciona.fflush(stdout);
após cada umprintf()
Respostas:
Sim - padrões POSIX mais antigos definidos
usleep()
, portanto, isso está disponível no Linux:usleep()
leva microssegundos , então você terá que multiplicar a entrada por 1000 para dormir em milissegundos.usleep()
foi descontinuado e removido do POSIX; para novo código,nanosleep()
é preferido:Um exemplo de
msleep()
função implementada usandonanosleep()
, continuando o sono, se for interrompido por um sinal:fonte
Você pode usar esta função de plataforma cruzada:
fonte
_POSIX_C_SOURCE >= 199309L
, como no caso de-ansi
ou-std=c89
, eu recomendaria usar emstruct timeval tv; tv.tv_sec = milliseconds / 1000; tv.tv_usec = milliseconds % 1000 * 1000; select(0, NULL, NULL, NULL, &tv);
vez deusleep(milliseconds * 1000);
. O crédito vai aqui .nanosleep()
documentação: man7.org/linux/man-pages/man2/nanosleep.2.html . A publicação dos links da documentação para cada função específica da plataforma usada aqui seria útil.gcc -Wall -g3 -std=c11 -o sleep_test sleep_test.c && ./sleep_test
no Linux Ubuntu, com gcc versão 4.8.4, eu recebo o seguinte aviso:warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration]
. A solução é adicionar as 2 seguintes definições ao topo do seu código: 1)#define __USE_POSIX199309
e 2)#define _POSIX_C_SOURCE 199309L
. Ambos são necessários para que o código seja compilado sem nenhum aviso (e também para usar ananoseconds()
função que ele tem disponível).Como alternativa
usleep()
, que não está definida no POSIX 2008 (embora tenha sido definida até o POSIX 2004 e esteja evidentemente disponível no Linux e outras plataformas com histórico de conformidade com o POSIX), o padrão POSIX 2008 definenanosleep()
:fonte
Além do sono , a seleção humilde com os conjuntos de descritores de arquivos NULL permitirá pausar com precisão de microssegundos e sem o risco de
SIGALRM
complicações.sigtimedwait e sigwaitinfo oferecem comportamento semelhante.
fonte
fonte
fonte