[완료] 터미널에서 아무 입력이나 발생시 발생하는 시그널이 있나요?

fastwater의 이미지

터미널에서 아무 입력이나 발생시 발생하는 시그널이 있는지 궁금합니다.

Ctrl+C는 SIGINT 를 발생시키고

각각 몇몇 특정 키들은 특정 시그널을 발생 시키는 것으로 알고 있습니다만 현재 과제를 하는 도중

서버를 만들고, 서버를 종료할 때 특정 문자열을 입력 받으면 서버를 종료하도록 구현을 하려 합니다. 현재는 쓰레드를 하나 만들어서 while 루프로 fgets를 계속 돌리도록 했습니다만 뭔가 이건 좀 아니다 싶은 생각이 들어서 말이죠.

아무런 키보드 입력이 들어오면 시그널 처리 함수로 가서 fgets나 read로 버퍼에 stdin에 기록된 값을 읽어들이려면 어떻게 해야 할까요?

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

답변 감사합니다. 그런데 select 함수를 보니 파일 디스크립터의 움직임을 관찰하는 함수 같은데 이걸 어디다 쓰는지 감이 안잡히네요;

원래 질문의 요지는
터미널에 뭔가 입력이 들어옴 -> 뭔가 시그널이 발생 -> stdin에 있는 데이터를 버퍼에 저장
이었습니다. 물론 메인 함수는 다른거 하느라고 바빠서 다른 뭔가가 처리를 해줘야 겠죠.
현재는 쓰레드로 입력 받는 루프 하나 더 만들어서 구현했습니다. 어떻게 하는게 정상적인 방법일까요?

ymir의 이미지

man select 해보시면 EXAMPLE 에 stdin 을 모니터링하는 예제 코드가 있을겁니다.
그냥 보편적인게 무난한 방법 아닐까 싶네요.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

fastwater의 이미지

select가 뭔지도 모르는 참이라 이상한 방식으로 구현을 하려 했었네요 ㅎㅎ;

Hyun의 이미지

io가 있을 때 SIGIO signal을 받을 수 있는것 같습니다. 직접 써보진 않아서...
http://www.makelinux.net/ldd3/chp-6-sect-4.shtml

fastwater의 이미지

그런데 SIGIO는 뭔가 다른데 쓰는 시그널 같아요;; 해보니까 잘 안되네요.

Hyun의 이미지

콘솔도 파일이므로 다를건 없습니다.
스래드 없이 간단한 구조로 구현할수 있어서 시그널을 이용한 방법이 많이 쓰이는걸로 알고있습니다.

ymir의 이미지

아무런 입력이 없는 동안 주기적으로 짧은 시간동안 무언가를 체크할 필요가 있을 때도 select() 를 쓰기도 합니다.
key down 이벤트를 받아서 처리한다 하더라도, 결국은 엔터가 입력될때까지는 기다리게 될겁니다.
결국은 select() 로 fd 를 감시하다가, 데이터가 있으면 그 때 읽어들여도 비슷할 것 같아서 말씀드렸습니다.

음.. 그런데 메인이 바빠서 입력값을 처리하기 곤란한 정도라면..
그 바쁜일을 thread 에게 맡기고, 메인은 control 에 주력하는게 나을것 같습니다.
사실 이런 경우에는 select() 는 필요 없을 수도 있습니다.

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
 
int main(void)
{
	fd_set rfds;
	struct timeval tv;
	int retval;
	FILE *fp = stdin;
	int fd = fileno(fp);
	char buf[BUFSIZ];
 
	while (1)
	{
		/* Watch stdin (fd 0) to see when it has input. */
		FD_ZERO(&rfds);
		FD_SET(fd, &rfds);
 
		/* Wait up to one second. */
		tv.tv_sec = 1;
		tv.tv_usec = 0;
 
		retval = select(fd+1, &rfds, NULL, NULL, &tv);
		/* Don’t rely on the value of tv now! */
		if (retval == -1)
		{
			perror("select()");
			return EXIT_FAILURE;
		}
		else if (retval == 0)
		{
			printf("No data within one second.\n");
			continue;
		}
 
		/* Data is available now. */
		if (FD_ISSET(fd, &rfds))
		{
			fgets(buf, sizeof(buf), fp);
 
			/* Parse input command. */
			if (!strncmp(buf, "quit", strlen("quit")))
				/* stop busy work */
				break;
			else
				printf(" > %s", buf);
		}
	}
 
	exit(EXIT_SUCCESS);
}

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

fastwater의 이미지

일단 메인이 바쁘다기 보다는 서버를 돌리는거라 클라이언트 접속을 기다려야 되서 accept에서 대기를 타고 있는 중이라서 루프가 멈춰있는 상태거든요;
결국 쓰레드 한개를 추가를 하긴 해야하는거군요.

ymir의 이미지

모든 fd 를 하나의 select 로 몰아서 감시하고...
listen socket, client socket, stdin 에서 각각의 이벤트가 있을 때마다..
자기 일을 하도록 하면 됩니다.

FD_SET 으로 다른 fd 들을 추가하시고..
FD_ISSET 으로 해당 fd 에 이벤트가 발생했는지 보세요.
listen socket 이라면 accept 호출..
client socket 이라면 read 호출..
stdin 이라면 fgets 로 읽어서 커맨드 처리..

select, epoll 등은 특히 소켓 처리할 때 많이 사용되는 유용한 함수입니다.
친해지면 아주 도움되는 녀석들입니다.

아래 샘플 코드에 stdin 의 fd 만 추가하면 비슷해지겠네요.
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/select

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

fastwater의 이미지

돼지목에 진주라고 함수를 봐도 용도를 이해를 못하고 있었네요.

감사합니다 ^^

wujuan198710의 이미지

isten socket,rolex uhren preisliste client socket, stdin 에서 각각의 이벤트가 있을 때마다..
자기 일을 하도록 하면 됩니다.

FD_SET 으로 다른 fd 들을 추가하시고..
FD_ISSET 으로 해당 fd 에 이벤트가 발생했는지 보세요.
listen socket 이라면 accept 호출..
client socket rolex uhren damen이라면 read 호출..
stdin 이라면 fgets 로 읽어서 커맨드 처리..

select, epollugg boots cardy 등은 특히 소켓 처리할 때 많이 사용되는 유용한 함수입니다.
친해지면 아주 도움되는 녀석들입니다.

Hyun의 이미지

낚였음.

댓글 달기

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