서버프로그램을 짜는데 스레드때문에..

skymagic01의 이미지

지금 서버를 짜고있는데요
어느 특정한시간에 함수를 호출할려고 하거든요
어떻게 처리해야 하는지 궁금하네요
세마포어 로 해서 하고있는데 이걸루 하는것이 맞는지 궁금하네요;;

choissi의 이미지

님께서 말씀하신 "특정한시간" 요것에 대한
추가정보가 필요 합니다..

초단위의 정확도 인지..
timer 처럼 반복되는 형태인지...

울랄라~ 호기심 천국~!!
http://www.ezdoum.com

skymagic01의 이미지

하루에 한번 실행되도록 해야하거든요

예를 들어 하루에 12시 정각에 한번 호출하여 작업을 해야 하는데 방법을 잘모를겠네요.

skymagic01의 이미지

int main()
{
	int server_sockfd, client_sockfd;					//socket 번호
	int server_len, client_len;							//socket 길이
    int i,result,file_result;
 
	fd_set readfds, bugs_avatafds;
	sigset_t mask;										//signal 처리 구조체 변수 선언
 
	pthread_t a_thread;									//thread 형 변수
	void *thread_result;								//thread 함수의 리턴값을 저장할 변수(이 프로그램에서는 의미없음)
 
	struct sockaddr_in server_address;					// socket 구조체 선언
	struct sockaddr_in client_address;
 
	server_sockfd = socket(AF_INET, SOCK_STREAM, 0);	// 소켓지시자 생성 
 
	server_address.sin_family = AF_INET;				// 인터넷 소켓 
	server_address.sin_addr.s_addr = htonl(INADDR_ANY);	// 서버 어드레스 생성 
	server_address.sin_port = htons(PORT);				// 서비스 포트번호 생성
 
	server_len = sizeof(server_address);				// 소켓 크기
 
	bind(server_sockfd,(struct sockaddr *)&server_address, server_len);	// 소켓을 정의했고 정의된 정보로 묶는 작업
 
	listen(server_sockfd, 5);							// 대기상태가 된다.
 
	FD_ZERO(&readfds);									//server_sockfd의 입력을 다루기 위해 readfds를 초기화한다. 
    FD_SET(server_sockfd, &readfds);	
 
 
	log("Bugs Avata Ting SK-VM server waiting");				//log파일로 서버가 시작된 시간을 남긴다. 
	printf("Bugs Avata Ting SK-VM server waiting\n");
 
 
	signal_prepare();									//signal 처리
	my_signal_masking(&mask);							//mask를 이용하여 필요한 signal만 처리하고 싶으면 처리한다. 
 
		// 무한루프를 돌면서 통신을 수행하고 클라이언트에 맞는 서비스를 제공한다.
		while(1){
			char ch;
			int fd;
			int nread;		
 
			bugs_avatafds = readfds;
			//클라이언트의 요청을 기다린다. 
			result = select(FD_SETSIZE, &bugs_avatafds, (fd_set *)0, (fd_set *)0, (struct timeval *) 0);
 
			//에러가 있으면 에레메세지 띄우고 실행 종료하라. 
			if(result < 1) {
				perror("bugs_avata_server");
				exit(1);
			}	
			//동작이 있다는 것을 안다면 FD_ISSET을 사용하여 차례대로 확인하면 동작이 존재하는 
			//기술자(dedataor) 를 찾는다. 
			for(fd = 0; fd < FD_SETSIZE; fd++) {
				if(FD_ISSET(fd,&bugs_avatafds)) {
 
				//만약 server_sockfd에서 동작이 있었다면 세로운 접속을 위한 요청이므로, decdataor 모음에
				//관련 client_sockfd를 추가한다. 
					if(fd == server_sockfd) {
						client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
 
						FD_SET(client_sockfd, &readfds);
						printf("fd %d 클라이언트 추가\n", client_sockfd);
					}
 
					//클라이언트 동작
					else {
						ioctl(fd, FIONREAD, &nread);
 
						//close를 수행했다면 클라이언트는 제거되었으므로 이것을 dedataor 모음에서 제거
						if(nread == 0) {
							close(fd);
							FD_CLR(fd, &readfds);
							printf("fd %d에 클라이언트 제거\n", fd);
							if(fd==us.fd)
							{
							//	ClearFile(&us);
							}
							//printf("fd %d 클라이언트 제거\n", fd);
						}
 
						// VM 서비스 처리
						else {
							printf("fd %d에게 서비스 제공\n", fd);
							bugs_avata_service(fd,&readfds);
								//exit(0);
							}//else
					}//else
				}//if
			}//for
		}//while
 
	return 0;
}//main		

메인부분인데요
저기 BugsServer() 이함수내에서 받은 메세지를 처리하는 부분이고요
제가 할려는것이 지금 mysql에서 하루에 한번 디비를 업데이트 해줘야하거든요
그래서 그것을 물어볼려구 염..

스레드를 쓰면댄다고 하는거 같은데
어떤식으로 처리해야하는지 잘모르겠네요.