2011-09-25 2 views
4

저는 C에서 상당히 새롭지 만 작은 다중 스레드 응용 프로그램을 작성합니다. 스레드에 지연을 도입하려고합니다. 나는 'usleep'을 사용하고 있었고 그 행동은 내가 원했던 것이지만 C99에서 경고를 생성합니다. 기능 'usleep'현대 POSIX 환경에서 usleep 외에도 사용할 수있는 항목은 무엇입니까?

그것은 단지 경고하지만 그것은 나를 귀찮게의

암시 적 선언. 나는 인터넷 검색에 대한 답변을 찾았지만, CPU 집중적 인 것처럼 보이는 while-loop/timer 방식을 사용했습니다.

편집 :

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

그리고 함께 컴파일러를 호출하고 있습니다 :

내 포함은

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

편집 # 2 : 제작 한

0을 포함하는 새 파일

그리고 여전히 경고가 표시됩니다.

EDIT # 3 : 제안 된대로 질문의 텍스트를 업데이트했습니다. 기능 'usleep'의

+0

귀하의 질문은 C99와 관련이 없습니다. 그러한 것들은 정의의 범위를 벗어난다. 아마도 "POSIX"로 대체하여 제목을 바꿀 수 있습니까? –

+0

스레드 동기화를 위해 잠자기를 사용하면 물고기가 냄새가납니다. 아마도 어떤 종류의 뮤텍스 나 신호를 사용하고 싶습니까? – eyalm

+0

@eyaim - 뮤텍스와 pthreads 라이브러리를 사용하고 있습니다. 나는 usleep을 사용하여 생성 된 출력을 느리게 만들려고 했으므로 'quazi'실시간으로 나타납니다. –

답변

5

표준 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 초 + 500,000,000 나노초)

c99 main.c -D _POSIX_C_SOURCE=200809L 

_POSIX_C_SOURCE 매크로는 POSIX 정보에 대한 적절한 값을 정의해야 사용할 수있다.

또한 -Wall, -pedantic 및 -W 옵션은 POSIX c99 명령에 대해 정의되어 있지 않으므로 gcc 명령과 비슷합니다 (시스템에서 작동하는 경우 해당 명령은 정상적으로 작동하지 않는다는 것을 알고 있어야합니다. 다른 POSIX 시스템으로 이식 가능).

0

암시 적 선언은

이 경고는 일반적으로이 경우 unistd.h에,하지 #include 올바른 헤더 파일을 한 것을 의미한다.

+0

unistd.h가 포함됩니다. –

1

매뉴얼 페이지 :이 기능은 사용되지 않습니다. 대신 nanosleep을 사용하십시오.

+1

Nanosleep에서 동일한 경고가 나타납니다. 수면은 작동하는 것처럼 보이지만 입력으로 초만 허용합니다. –

+1

적절한 헤더 파일을 포함시켜야합니다. 이 모든 것은 문서에 기록되어 있습니다. – zvrba

+0

심지어 "POSIX.1-2008은 usleep()의 사양을 제거합니다." –

4

당신은 현대 POSIX 시스템에서 아마 :

POSIX.1-2008은 usleep의 사양을 제거합니다().

제 시스템 (Linux)에는 해당 기능을 다시 설정하기 위해 설정해야하는 매크로에 대한 자세한 설명이 있습니다. 하지만 zvrba가 이미 준 조언을 따라야하고 대신 nanosleep을 사용하십시오.

+0

당신의 통찰력에 감사드립니다. 예 - 저는 현대의 POSIX 시스템을 사용하고 있습니다. 이것은 usleep()이 경고를 발생시키는 이유를 설명하는 것처럼 보입니다. 그러나 포함 된 헤더 파일에 관계없이 nanosleep을 사용하면 동일한 오류가 발생하는 것 같습니다. –

+2

소스 파일의 맨 위에'#define _XOPEN_SOURCE 700' 또는 컴파일러 명령 줄'-D_XOPEN_SOURCE = 700'을 추가하십시오. –

0

#include <unistd.h> 있었습니까?

대신 nanosleep() 나노초 및 sleep() 초 단위로 비슷한 방법을 사용할 수 있습니다. 또는 다른 방법으로 clock()을 사용할 수 있지만 이것이 CPU 낭비라고 생각합니다.

+0

예 - unistd.h를 포함하여 시도했습니다. –

+0

'# import'? .... –

+0

아, 죄송합니다, 제가 편집하겠습니다. 나는 #include를 의미한다. 감사. – DarkByte

관련 문제