1. process 에서 select()를 한다 connect 가 들어오면 accept를 하고 thread 를 생성시킨다
2. thread에서 db insert(oracle)를 하고 나서 fgetc(stdin)를 하면 1에 프로세스에서 select중에 EINTR 이 잡히네요 오라클 db 작업을 안햇을때는 그런거 없었는데... 어쨋든 인터럽트를 쓰레드내에서 잡아내서 프로세스까지 안가게 할수 있는 방법없을가요?
select 에서 EINTR 이 잡혀도 fd 검사를 잘하시면 문제가 없을듯 한데요... -.-;;
혹, oracle library 내에서 fork가 일어날지 모릅니다.
확인해보세요. 전에 그런경험이 있어서, oracle 호출하기 전에 signal handler를 대피시켰다가 다시 복원한 적이 있습니다.
---http://coolengineer.com
8) 이게 맞을지 모르겠지만 오라클 디비에 접속시 디스크립터가 4개(?)열리는 걸로 알고 있습니다. 3갠가? 기억이 가물가물 select()에서 maxfd값을 수정해 보세요....
집에나 갈까?
1. 시그널을 대피시켜라 : 무슨 말인지?
2. maxfd값을 조정해라 : maxfd는 기존 연결값으로 정의되어있는데요.. 오라클에서 디스크립터를 더 열어서 사용한다고 해도 select에서 EINTR이 걸리는것과 무슨 관계가 있나요?
1. process : select()
1-1 thread : db_connect(); insert(); db_disconnect(); recv or fgetc or sleep... 등에 system 콜 발생시 1에 process에 select()에서 EINTR이 잡힘(블럭풀림) 더 분석을 해보니 db_disconnect()를 빼면 정상 문제 코드 : SQL COMMIT WORK RELEASE;
SQL COMMIT WORK RELEASE 만 하면 그 다음 system call시 프로세스에 select()에 EINTR이 잡힘..
대안이 없을까요?
그 시그널이 무엇인지 trace 해보세요.
linux:strace, solaris:truss, hpux11:tusc
등을 사용하시면 됩니다.
SIGCLD가 와서 프로세스로 전달되는것 같네요
이런경우 SIGCLD를 어떻게 처리하는게 좋은가요.
fork가 일어나는 부분은 어디인가요?
그리고, 어디던지 간에, select에서 SIGCHLD 때문에 -1로 error가 나오며, errno가 EINTR이라면 다시 select 하는 것을 처리해주는 것은 예외적인 상황이 아니며, 모든 서버 프로그램이 해야하는 일입니다.
만약 fork를 명시적으로하지 않았는데, library내에서 일어난다면, 아마 그 라이브러리 설명 어딘가에 signal handle을 해야한다고 씌어 있거나, 아니면, 라이브러리가 제대로 처리하지 못하는 까닭입니다.
보통 라이브러리 내에서 signal handler를 대피(signal, sigaction)시킨다음 fork한 뒤, wait 하여 fork 된 child를 접수한뒤, signalhandler를 복원시켜줘야합니다. 이 작업이 되어 있지 않나 봅니다.
signal handler를 대피시킨다는 말은 signal 함수의 return 값을 저장하였다가 다시 등록한다거나, sigaction의 마지막 인자 값을 받았다가 다시 넣어 주라는 의미입니다.
텍스트 포맷에 대한 자세한 정보
<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]
select 에서 EINTR 이 잡혀도 fd 검사를 잘하시면문제가 없
select 에서 EINTR 이 잡혀도 fd 검사를 잘하시면
문제가 없을듯 한데요... -.-;;
oracle library 내에서 fork
혹, oracle library 내에서 fork가 일어날지 모릅니다.
확인해보세요. 전에 그런경험이 있어서, oracle 호출하기 전에 signal handler를 대피시켰다가 다시 복원한 적이 있습니다.
---
http://coolengineer.com
8) 이게 맞을지 모르겠지만 오라클 디비에 접속시 디스크립터가 4개(?)
8) 이게 맞을지 모르겠지만 오라클 디비에 접속시 디스크립터가 4개(?)열리는 걸로 알고 있습니다. 3갠가? 기억이 가물가물
select()에서 maxfd값을 수정해 보세요....
집에나 갈까?
답변에 감사드립니다.
1. 시그널을 대피시켜라
: 무슨 말인지?
2. maxfd값을 조정해라
: maxfd는 기존 연결값으로 정의되어있는데요..
오라클에서 디스크립터를 더 열어서 사용한다고 해도
select에서 EINTR이 걸리는것과 무슨 관계가 있나요?
1. process : select()
1-1 thread :
db_connect();
insert();
db_disconnect();
recv or fgetc or sleep... 등에 system 콜 발생시
1에 process에 select()에서 EINTR이 잡힘(블럭풀림)
더 분석을 해보니 db_disconnect()를 빼면 정상
문제 코드 : SQL COMMIT WORK RELEASE;
SQL COMMIT WORK RELEASE 만 하면 그 다음 system call시 프로세스에 select()에 EINTR이 잡힘..
대안이 없을까요?
그 시그널이 무엇인지 trace 해보세요.linux:strace,
그 시그널이 무엇인지 trace 해보세요.
linux:strace, solaris:truss, hpux11:tusc
등을 사용하시면 됩니다.
---
http://coolengineer.com
찾아보니 SIGCLD 네요
SIGCLD가 와서 프로세스로 전달되는것 같네요
이런경우 SIGCLD를 어떻게 처리하는게 좋은가요.
fork가 일어나는 부분은 어디인가요?그리고, 어디던지 간에, s
fork가 일어나는 부분은 어디인가요?
그리고, 어디던지 간에, select에서 SIGCHLD 때문에 -1로 error가 나오며, errno가 EINTR이라면 다시 select 하는 것을 처리해주는 것은 예외적인 상황이 아니며, 모든 서버 프로그램이 해야하는 일입니다.
만약 fork를 명시적으로하지 않았는데, library내에서 일어난다면, 아마 그 라이브러리 설명 어딘가에 signal handle을 해야한다고 씌어 있거나, 아니면, 라이브러리가 제대로 처리하지 못하는 까닭입니다.
보통 라이브러리 내에서 signal handler를 대피(signal, sigaction)시킨다음 fork한 뒤, wait 하여 fork 된 child를 접수한뒤, signalhandler를 복원시켜줘야합니다. 이 작업이 되어 있지 않나 봅니다.
signal handler를 대피시킨다는 말은 signal 함수의 return 값을 저장하였다가 다시 등록한다거나, sigaction의 마지막 인자 값을 받았다가 다시 넣어 주라는 의미입니다.
---
http://coolengineer.com
댓글 달기