2010-12-09 1 views
0

저는 chatroom과 매우 유사한 기능을하는 TCP 서버를 작성 중이며이 질문을 보았습니다.부모가 자식 (child)을 죽이기 위해 신호를 받았을 때 사기꾼 함수에 추가 매개 변수를 집어 넣는 방법 (c)?

사용자가 연결하면 사용자를 제공하기 위해 하위 프로세스가 만들어집니다.
사용자가 로그인 할 때, 나는, 텍스트 파일로 online.txt
을 자신의 이름을 저장하지만 사용자가 로그 아웃 할 때, 나는 online.txt (문제)에서 사용자를 제거 할 필요가 부모를 다음 signalsreaper()을하고 아이를 죽인다.

내 질문은 :

Q1 : 나는 사신에 대한 추가 정보를 짜낼 수있는 방법이 또한 online.txt에서 사용자를 제거 할 수 있도록 (예 : 사용자가 로그인하는 데 사용하는 사용자 이름 등)? 아니면 이렇게하는 것이 더 좋은 방법일까요?

Q2 : 여기서 sigreaper()은? Reaper에 매개 변수를 추가 할 수 있습니까?

질문 3 : login.txt의 일종의 기본 키로 자녀의 PID를 사용할 수 있습니까? 그렇다면 어떻게하면 부모가 호출하는 reaper() 동안 자녀의 PID를 검색 할 수 있습니까?

사신은 다음과 같습니다

void reaper(int sig)//where does sig come from? 
{ 
int status; 

while (waitpid(-1, &status, WNOHANG) >= 0) 
    ; 
} 

부모에 의해 사용되는 신호는 다음과 같습니다 : 너무하지

(void) signal(SIGCHLD, reaper);//how can I add more parameters? 

내가 한 번에 3 개 질문을 희망 사전에 감사합니다 욕심이 많다.
질문에 대한 통찰력이 있으면 대단히 감사하겠습니다.

+1

부모님은 사신으로 아이를 죽이라는 신호를받습니다 ... 때로는 무의미하고 무의미한 구경꾼이 이런 질문을 입력하는 동안 어깨를 들여다 보았을 때 어떻게 생각할 지 궁금합니다. 그리고 당신에게 무슨 일이 벌어 질 것이고 그들이 경찰을 부를 때 당신이 어떻게 설명 할 것인가 ... – Secure

+0

나는이 포럼에서 금방 나 금지 될 거라고 생각합니다. –

답변

2

질문에서 수집 할 수있는 한 상위 프로세스는 SIGCHLD에 대한 핸들러로 reaper()를 등록합니다. 로그인을 감지하면 사용자 이름을 파일에 기록하고 자식을 생성합니다.

로그 오프 할 때 자식 프로세스가 로그 오프를 감지하여 종료되므로 reaper() 함수가 호출됩니다.

그렇다면 서버가 사용자 이름에 PID를 매핑하는 데이터 구조를 유지 관리하지 않는 것이 어떻겠습니까? 그런 다음 waitpid에서 리턴 값을 가져 와서 파일에서 제거해야 할 사용자 이름을 식별하십시오.

따라서 요약하면 다음과 같습니다.

1) 아니오. 예.

2) 핸들러가 수신 한 신호로부터. No.

3) 예. waitpid()의 반환 값에서.

+0

통찰력을 가져 주셔서 대단히 감사합니다! waitpid()에 대한 문서는 너무 길어 반환 값 섹션까지 읽지 못했습니다. BTW, 동시 서버이기 때문에 다중 프로세스를 사용합니다. 로그 오프 조치는 다른 터 L 널에 의해 수행됩니다. –

+1

실제로 함수 선언에서 반환 유형이 pid_t임을 알 수 있습니다. 동시 서버 일지라도 다중 스레드 (yeuch) 또는 단일 스레드를 사용하여 수행 할 수 있습니다. 싱글 스레드를 선호합니다. 나는 회사가 하나의 스레드 웹 서버를 만들었다는 것을 알고 있었지만 기본적으로 그들 자신의 멀티 스레딩 코드를 효과적으로 사용하여 속였습니다. 어쨌든 다중 프로세스가 좋을지라도, 모든 것을 싱글 스레드로 처리하는 것이 가능합니다. 그것은 당신이 chatroom을 어떻게 동작 시키길 원하는지에 달려 있습니다. – AlastairG

1

질문 1 : 특정 프로세스를 실행하기위한 신호 처리기를 구성하는 것이 적절합니까? 그러나 더 나은 해결책은 파일을 사용하는 것이 아니라 사용자가 로그인 한 것을 저장하는 메모리 구조를 만드는 것입니다. 그런 식으로 사신은 메모리에서 항목을 삭제하거나 제안 된 신호 처리기를 삭제할 수 있습니다.

질문 2 : OS 또는 아키텍처에 익숙하지 않지만 매개 변수 값에 대해 SIGCHLD가 reaper (int sig)로 전달 될 것입니다.

질문 3 : PID를 가져 오는 것은 특정 사항입니다. POSIX 타입의 경우 보통 unistd ..에서 얻은 getpid()를 사용합니다. 그러나 파일로 실제로하고 싶다면 질문합니다.

보안 위험에 노출되어있는 곳 곳곳에 신호를 보낼 때 솔루션이 경쟁 조건에 취약해질 수 있습니다.

동료 사용자는 언제든지 저를 수정하십시오. 지혜를 구하는 데있어서 반드시 하나의 교훈을 받아 들여야합니다.

+0

통찰력을 가져 주셔서 대단히 감사합니다! 특히 Q1! 나는 그 주제에 대해 더 많은 연구를 할 것입니다! –

+1

나는 그가 죽은 아이의 PID를 원한다고 생각한다. 그래서 waitpid()는 getpid()가 아니라 현재 프로세스의 PID를 반환 할 필요가있다. fork()는 처음에 자식의 PID를 반환합니다. 하나의 프로세스 (상위 프로세스) 만 파일을 관리하는 경우 어떻게 경쟁 조건을 갖게되는지 모르겠습니다. 데이터를 메모리에 저장하는 것이 가장 좋습니다. 파일을 사용할 특별한 이유가 있다고 생각했습니다. – AlastairG

관련 문제