select 함수 return value problem

cpulpul의 이미지

간단히 source를 보여드리겠습니다

#define FIRST	"fifo_file"
#define SECOND     "/dev/xxxx"  

char	buff[BUFF_SZ];
int	state;
struct	timeval tv;
fd_set	readfds;


/* fifo 초기화 */
fd[0] = open(FIRST, O_RDONLY);
fd[1] = open(SECOND, O_RDONLY);

for (;;)
{
                FD_ZERO(&readfds);
                FD_SET(fd[0], &readfds);
                FD_SET(fd[1], &readfds);

                tv.tv_sec = 1;
                tv.tv_usec = 0;

                state = select(fd[1]+1, &readfds, (fd_set *)0, (fd_set *)0, &tv);
                switch (state)
                {
                 case -1:
	                perror("select error : ");
	                printf("errno %d\n", errno);
                                exit(0);
                  case 0:
                                break;
                 default :
                                if (FD_ISSET(fd[0], &readfds))
                                {
                                           if (read(fd[0], buff, BUFF_SZ) > 0)
                                            /* data 처리 */
                                 }

                  	if (FD_ISSET(fd[1], &readfds))
                	{
	                            if (ioctl(fd[2], 0, &data) == 0) 
		             /* data 처리 */
                                }
                                break;
                 }
}

select함수에서 -1을 return 하며 빠져나와버립니다.
fd[1] 이 문자장치 이여서 그런건지도.. 고수님들의 답변을 부탁드립니다.
mushim의 이미지

사용자 프로그램은 해당 파일이,

정규 파일이건, 장치 파일이건 상관없이 사용하지만

커널 내부에서는 각각 따로 구현이 되어 있습니다.

해당 장치 파일에 구현되어 있는 select 함수를 참조하셔야 할것 같네요.

pynoos의 이미지

perror("select error : ");

여기에서 출력되는 error message를 보여주세요.

송지석의 이미지

아마 fd[0] fd[1]의 값을 에러체크 안하셔서 그럴 것 같기도 한데

윗분 말씀대로 perror로 에러 내용을 프린트 해보셔야 정확하게 알 수 있습니다.

운형의 이미지

블럭이 되는 함수들의 경우 에러로 인해 -1을 리턴한다면 반듯이 ERRNO값을 체크해주어야 합니다. 이값을 체크해서 프로그램한 사람이 예상했던(반듯이 처리해야하는 코드) 에러코드에대해서는 적당한 처리를 해주어야 합니다.

f[1]+1을 최대 디스크립터로 잡는것은 위험한 발상이므로(보장되지 안는다는 의미죠) (f[0]>f[1]?f[0]:f[1])+1 정도로 교채하시길 권하며, 현재의 코드에는 크게 무리는 없습니다.

ERRNO값을 체크해보시길 바람니다.

Do you think that's the air you are breathing now?

cpulpul의 이미지

select error : : No such device or address
errno 0

scobyseo의 이미지

예상했던대로 파일을 열지 못했네요..
장치 파일을 사용한다고 하셨는데..
그 장치가 설치 및 초기화되어 있지 않거나..
퍼미션에 문제가 있는 듯 합니다.
장치나 파일의 path를 한번 더 확인해 보시기 바랍니다.
특히 "fifo_file"이 실제로 존재하는지도 확인하는 것이 필요할것 같군요.
그리고 할 수 있으면 루트로 실행시켜보세요.

서명:
이것은 올리는 글에 첨부될 사인 문구입니다. 제한은 255 글자입니다

cpulpul의 이미지

답변에 정말 감사드립니다..

"/dev/ipxxx" 는 link 이고..

실제화일은
path : /devices/pseudo/ 경로 아래..

crw------- 1 root root 96, 3 3월 6일 17:09 ip@0:iplog
입니다...

여러 고수님들의 도움을 기다리겠습니다..

송지석의 이미지

fd[0] = open(FIRST, O_RDONLY);
fd[1] = open(SECOND, O_RDONLY);

일단 파일을 여시고,

에러체크를 하셔야 합니다.

에러체크 안하면 무슨 상황이 날지 모르기 때문에 절대 안정적인 플그램이 아니죠

fd[0] = open(FIRST, O_RDONLY); 
if (fd[0] == -1) {
    perror("open");
    exit(1);
}
fd[1] = open(SECOND, O_RDONLY); 
if (fd[1] == -1) {
    perror("open");
    exit(1);
}

그리고 이렇게 하셔야 무슨 일 때문에 에러가 났는 지 알 수 있습니다. 그냥 파일명이 이렇다고 설명만 하시면 알 수가 없죠.

cpulpul의 이미지

실제 코드에는 error검사를 수행하고 있습니다..

커널level에서 특정 data를 가공하여 위의 file에 담아두고, 그file을 open하여 읽어오는데.. 커널에서의 file 설정이 문제인듯 합니다..

답변에 정말 감사드립니다..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.