shell관련 문제인데.. 정말 이상해요.. 아무리 생각해도 이해가

gugudan의 이미지

#!/bin/bash 
/경로/test.sh 111  
while read -r data
do
/경로/test.sh 111  
done <aaa.dat


이런식으로 쉘을 만들었는데..
test.sh가 위에는 실행이 되는데
밑에는 실행이 되지 않습니다.
원래는 파일에서 값을 읽어서 처리를 할려고 했는데
하도 되지를 않길래 직접 값을 줬는데도
while loop안에서는 원하는 결과값이 나오질 않습니다.
어떻게 이럴수가 있는거죠?

아무리 생각해봐도 모르겠네요.

pynoos의 이미지

그럴일이 없는 것이 맞습니다만, 실제 소스 일부를 보여주시면 더 좋겠습니다.

gugudan의 이미지

소스는 위에서와 말한것처럼

#!/bin/bash
./aaa 11111
while read  -r  eeeee
do
./aaa 11111
done <test.dat
./aaa 11111

위에 aaa는 제가 C로 만든 간단한 프로그램이 들어있습니다.
위의 소스를 보면 제가 aaa를 3번 호출했는데
루프 들어가기 전과 루프 끝난 후의 aaa는 정상적으로 실행이 됩니다.
그런데 루프 가운데 있는 aaa는 원하는 결과가 나오지 않습니다.

참고로 aaa라는 프로그램은
로직상 종료할때 특정 문자를 printf를 이용해서 출력할 뿐입니다.
그런데 루프 안에 있는건 그냥 빈 라인만 나옵니다.
루프 전과 루프 마지막은 원하는 결과가 나오고 있고요..

aaa의 로직이 문제가 있다면 루프 전과 루프 후에도 결과가
안나와야 정상인거 아닌가요?
루프 전과 루프 후가 정상적으로 나온다면 그건 이상이 없는거 아닌가요?

아빠곰의 이미지

test.dat 은 어떤녀석인가요?

시험삼아 test.dat 파일을 다음처럼 고쳐서 다시 실행해보시면 어떨까요.

 cat > test.dat
1
2
^d

해서 실행해 보시면 루프가 두번 돌아서 ./aaa 11111 이 네번 실행될 것으로 보이는군요.

----
아발발다빠따반반나다발딸발발다빠따따맣밤밤따받따발발다따밝다발발다빠따따밤반다빠따다맣밥발
발다따밥다발발다따박다발발다빠따따밞밭밭다따다맣아희

gugudan의 이미지

네..역시 마찬가지입니다.

지금 로직에서는 test.dat를 읽어서 사용하는것은 없고..
단지 루프 갯수에만 이용되겠네요..

10개를 하면 10개의 빈라인만 생성되네요.

역시나 처음과 마지막만 값이 나오네요..

pynoos의 이미지

맨 위에 set -x 를 넣고 수행해보시고,
./aaa 에 해당하는 놈도 비슷하게 디버깅해보세요.

gugudan의 이미지

        FD_ZERO(&read_fds);
        FD_SET(0, &read_fds);
        FD_SET(m_socketfd, &read_fds);
        if((ret=select(m_socketfd+1, &read_fds, (fd_set *)0, (fd_set *)0, (struct timeval *)NULL)) < 0)
        {
            return -1;
        }
        if (FD_ISSET(m_socketfd, &read_fds))
        {
            int size;
            if ((size = read(m_socketfd, recv_buf, 1024)) > 0)
            {
                recv_buf[size] = '\0';
            }
            shutdown(m_socketfd,2);
            close(m_socketfd);
            break;
        }
        cnt++;

루프를 돌리지 않고 단순하게 이벤트만 오면 처리를 하게끔 코딩을 해
놓았더군요..

쉘에서 파일을 읽을때 이벤트가 발생했는데
막상 다른 이벤트이니 원하는 결과값을 가져오지 못하고 처리를 하다 보니
결과값이 나오질 않았네요..

gugudan의 이미지

위와 같은 문제가 발생하여
문제를 해결할려고 생각을 해 보았는데..

    while(1)
    {
        FD_ZERO(&read_fds);
        FD_SET(0, &read_fds);
        FD_SET(m_socketfd, &read_fds);
        if((ret=select(m_socketfd+1, &read_fds, (fd_set *)0, (fd_set *)0, (struct timeval *)NULL)) < 0)
        {
            printf("select error\n");
            return -1;
        }
        printf("ret : %d\n",ret);
        if (FD_ISSET(m_socketfd, &read_fds))
        {
            int size;
            if ((size = read(m_socketfd, recv_buf, 1024)) > 0)
            {
                recv_buf[size] = '\0';
            }
            shutdown(m_socketfd,2);
            close(m_socketfd);
            break;
        }
        cnt++;
    }

이런식으로 처리를 하였는데 cnt값을 출력해보니..
25000부터 50000이 넘는 경우도 발생을 하더군요..

위에와 같이 처리하는것이 맞는지요?

pynoos의 이미지

한 줄 씩 읽는 프로그램이라면, m_socketfd 를 fdopen 으로 여시고
연 FILE 구조체를 위의 read 대신 fgets 를 사용하여 처리하면 될 것 같습니다.

댓글 달기

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