select질문

vilinux의 이미지

int     max_fd;
struct  timeval timeout;		// select time  관련
    
FD_ZERO(&readfds);		// 초기화.. 지정된   descriptor 세트에서 제거
FD_SET(Com1, &readfds); 		//dev_keypad 2비트를 켠다 읽기 변화 감지  fd가 set안에 있는지 확인한다.
FD_SET(Com2, &readfds); 
FD_SET(Com3, &readfds); 
FD_SET(Com4, &readfds); 

max_fd = Com1 + 1;
    	
	timeout.tv_sec  = 0;
	timeout.tv_usec = 1000*500;		// 0.5 초로 셋팅한다
    
	res = select(max_fd, &readfds, NULL, NULL, &timeout); 
	if(res < 0){
		perror("com1 select failed");
	}
	else if(res == 0){
		printf("com1 select tiomeout res[%d]\n", res);
	}
	else{	
}

질문입니다

max_fd = Com1 + 1; 해주는데

com2,com3,com4 를 감지 할려면 어떻게 해야하나요?
여기도 +1 해주면 되나요 셀렉문을 다 이해하지못해서뤼~~~ㅡㅡ;
설명좀 해주세요~아님 fd 같이 쓴예제라동~~

yui의 이미지

아마도 com1이 com[1234]중에 가장 큰가 보네요.
0부터 (select의 첫번째 인자-1)의 fd를 검사합니다.

저기 맨아래 else에서 FD_ISSET으로 검사해보세요.

예제는 beej의 네트웍강좌에 있었던거 같습니다.
google에서 beej만 쳐보세요. *_*

remains의 이미지

앞에 분 말씀대로, FD_ISSET 매크로를 이용하시면 됩니다.

int max_fd;
struct timeval timeout; // select time 관련

FD_ZERO(&readfds); // 초기화.. 지정된 descriptor 세트에서 제거
FD_SET(Com1, &readfds); //dev_keypad 2비트를 켠다 읽기 변화 감지 fd가 set안에 있는지 확인한다.
FD_SET(Com2, &readfds);
FD_SET(Com3, &readfds);
FD_SET(Com4, &readfds);

max_fd = max(Com1, Com2, Com3, Com4) + 1;

timeout.tv_sec = 0;
timeout.tv_usec = 1000*500; // 0.5 초로 셋팅한다

res = select(max_fd, &readfds, NULL, NULL, &timeout);

if (FD_ISSET(Com1, &readfds)) {
/* 처리 */
}
else if (FD_ISSET(Com2, $readfds)) {
}

이런 식으로 해주시면 됩니다.
select의 max_fd 값에 1을 더해 주는 것은, select가 0~(maxfd - 1)의 범위에서
검사하기 때문입니다.
그럼...

vilinux의 이미지

근데
max(com1, com2.........) +1;

이런 함수가 있는건가요 ?? 어디 보니까 MAX( )+1
대문자로 이렇게 쓴것도 있던데......

은영신랑의 이미지

Quote:
select 함수의 첫 번째 인자로 검사해야 하는 총 디스크립터의 개수를 넘겨주게 됩니다. 그러나 일반적으로 디스크립터는 생성될 때마다 값이 1씩 증가하기
때문에 가장 큰 파일 디스크립터값에 1을 더해서 인자로 전달합니다.

1을 더하는 이유는 디스크립터 값이 0부터 시작하기 때문입니다. 따라서 n을 넘겨주면, select 함수는 검사하게 되는 파일 디스크립터의 범위를 0부터 n-1
로 설정하므로 반드시 1을 더해주어야 합니다.

이상 윤성우님의 TCP/IP 소켓 프로그래밍 내용이었습니다.

vilinux의 이미지

은영신랑 wrote:
Quote:
select 함수의 첫 번째 인자로 검사해야 하는 총 디스크립터의 개수를 넘겨주게 됩니다. 그러나 일반적으로 디스크립터는 생성될 때마다 값이 1씩 증가하기
때문에 가장 큰 파일 디스크립터값에 1을 더해서 인자로 전달합니다.

1을 더하는 이유는 디스크립터 값이 0부터 시작하기 때문입니다. 따라서 n을 넘겨주면, select 함수는 검사하게 되는 파일 디스크립터의 범위를 0부터 n-1
로 설정하므로 반드시 1을 더해주어야 합니다.

이상 윤성우님의 TCP/IP 소켓 프로그래밍 내용이었습니다.

지금 책이 없거든요~~~ ㅡㅡ;
낼사러 가야겠따 어떤책 사야죠??
아님 간단하게 설명이라도 프로그램하고 있는데 진전이 없넹..!

kdoll의 이미지

리차드 스티븐슨의 유닉스 네트워크 프로그래밍 이란 책입니다.
1판이나 2판이나 상관없습니다.

select설명은 매한가지.

메뉴얼 페이지 man select하셔도 충분하실듯.

lovemyin의 이미지

그 누가 추천을 해도 Stevens의 UNP를 추천할 것입니다.
어차피 구입하실려면 1,2 판보다는 이번에 나온 3판을 사시는게 어떨까
생각됩니다.
추가된 내용이 많이 있으니 3판을 보시는편이 좋을듯 싶습니다.

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.