fedora에서 popen좀 이상하네요..

uamyd5279의 이미지

안녕하세요..아직 어린 개발자입니다.

플랫폼 관련 작업...얼마전에 글올린 것 때문에..말씀들이 좀 계셨는데..
별것 아닙니다.

그냥 저희가 휴대폰으로 인터넷할 때 주고받는 패킷을 캡쳐하는 프로그램 만드는데요...그 프로그램이 작동하는 기반( 썬이니..리눅스니...등등 )에 의존적인 프로그램- 예를 들자면...시스템 부하가 큰 편이라 금방 죽거든요. 그래서 시스템 자원( 주로 CPU나 메모리 같은...) 사용량등을 확인하는 프로그램.. 뭐 그런 시스템 디펜던트한 프로그램을 제가 담당하고 있거든요....그래서 플랫폼 관련이다...라는 말을 사용했는데...임베디드나 그런거하고는 전혀 무관합니다.....^^ ;;;;

각설하고...

플랫폼 관련해서 작업을 하다보니...별 괴상한 에러가 다 생기네요..얼마전에 동료 직원 한명이 페도라( kernel 2.6.9 )에 저희 시스템을 포팅했는데....sun과 redhat 8.0등에서는 보이지 않던 에러 메세지가 출력이 됩니다.

sprintf(szTmp, "/sbin/ethtool %s", szNetStr);
(gdb)
112             fflush(NULL);
(gdb)
113             fp = popen((const char *)(szTmp), "r");

이 부분인데요...아래쪽에 popen을 하고 나면...
아래와 같은 메세지가 출력이 됩니다.
Detaching after fork from child process < pid >
작동에는 지장이 없지만...께름칙하네요..궁금하기도 하고..
고수님들의 조언 부탁 드립니다.
아무거나 상관없습니다. 관련된 거라면 어떤 조언이든 잘 살피겠습니다.
익명 사용자의 이미지

전형적으로 유닉스/리눅스 프로그램에서는
fork()+exec()를 빈번하게 호출합니다.
또한 fork()된 child프로세스와의 데이터 송수신을 위해 pipe()를 연결합니다.
즉, fork+exec+pipe라는 메카니즘을 연속적으로 사용하게 되는 경우가 많습니다.

자주쓰다보니, 아예,fork+exec+pipe를 한큐(?)에 해결해주는 라이브러리가
있으면, 편하겠다~ 라는 생각을 하게되겠지요.

그래서, popen()이란 것을 만듭니다. popen()은 내부적으로 fork+exec+pipe를 전부 합니다.
이를테면, *.gz처럼 gzip 등으로 압축된 파일을 실행시간에 압축풀어서 입력으로 사용하고 싶은 경우가 있겠지요.
zlib같은 라이브러리를 사용해서 프로그램해도 되겠지요.
그러나, 때에 따라서는 그냥 zcat등을 이용하고 싶은 경우도 있을테지요.

예를들어, test.txt.gz이라는 파일이 있다고 가정합시다.
본래 test.txt는 다음을 담고 있다고 가정합니다.
1,홍길동,남
2,황진이,여
....
이를 압축해놓은 test.txt.gz 파일은 그냥 읽을 수는 없겠지요.
zlib를 써서 읽을 수 있지만, zcat같은 외부유틸리티를 이용해서 압축풀고 읽어야 하는 경우가 있을 수 있겠습니다.
이때,
FILE *fp;

fp = popen("zcat test.txt.gz", "r");
으로 열면
...
fread()/fscanf()등...
으로 해당 파일을 읽을 수 있겠지요.

그런데, uamyd5279님의 질문에서는 디버거를 구동하여 이를 trace하고 있습니다.
gdb로 추적하는 대상은 처음 시작프로세스이며, popen()시에 새로이 생긴 프로세스(fork+exec+pipe에 의해 실행된 zcat프로세스)는 추적이 기본적으로는 안되겠지요?
이를 추적하려면 attach를 시켜서 이를 추적해야 하겠습니다.

위 질문에서 보면, ethtool을 그러한 용도로 사용하고 있습니다.
ethtool의 기능을 새로 구현하기는 귀찮지만(?!), 그 기능(ethtool)을 쓰고 싶은 경우의 코딩이지요. 대체로 물의가 없지만, 가급적 시간이 된다면, 외부 툴을 사용하기 보다는 직접 시스템호출수준으로 구현하시기를 권합니다.

* 결론적으로 별 물의가 없는 정상코드입니다. 또한 정상적인 gdb 추적이겠지요.

그럼 .

익명 사용자의 이미지

음 외부툴을 사용하는 경우 문제점은 아주 간단하게 예를들어,
PATH환경변수가 /usr/local/bin:/sbin
이런 식으로 되어 있다면, /usr/local/bin에 ethtool이라는 이름을 가지는
프로그램을 본래 목적하지 않는 이상한(?) 기능으로 작성해서 넣어놓는다면,
/sbin/ethtool이 실행되지 않고, /usr/local/bin/ethtool이 실행되는 불행한 사태를 맞이 할 수 있습니다.
당연히, full path를 주어서 코딩해야겠습니다만, "/sbin/ethtool %s" 모 이렇게요.
이 또한 그리 바람직하지는 않습니다. 외적인 요인에 의해 본래 프로그램의 의미가 왜곡될 수 있기 때문이며, 관리 포인트가 늘어나기 때문입니다.
하여간, 저는 그냥 만들어서 쓰시기를 권장하는 바입니다.

sio4의 이미지

프로그램의 목적/중요성, 또는 그것을 포함한 시스템의 목적/중요성에 따라서 위의 "내부 구현을 피하고 pipe를 사용하는 것"이 바람직한지 아닌지에 대한 평가는 괭장히 큰 차이가 있을 수 있겠다는 생각이 듭니다.

특히나 pipe/redirection 이라는 것이 "Unix 의 아름다움"을 이야기할 때 빠지지 않고 등장하는, 또한 목록의 앞쪽에 배치되는 데에는 그만한 이유가 있을 것입니다.

...
12127 ?        S      0:09 hanterm
12130 pts/0    S      0:01  \_ -tcsh
10963 pts/0    S      0:00      \_ tar jtvf bt_2004.tar.bz2
10965 pts/0    R      0:00      |   \_ bzip2 -d
10964 pts/0    R      0:00      \_ ps axf
...

10904 번의 "ps axf"가 출력한 내용의 일부입니다. tar 유틸리티는 j 옵션을 지원하기 위하여 단순하고 쉽게 PATH에 의존하여 pipe를 사용하고 있습니다. 아름답지 않습니까?

만약 제가 기가 막히게 멋진 압축 알고리즘을 구현하여 유틸리티로 만들어 배포한다면 tar 개발자는 "까짓것~" 이라고 말하고 옵션 하나와 몇줄의 코드만 추가하여 그 내부를 전혀 알지 못하는 상태에서 저를 지원해줄 것입니다.

만약 제가 별로 기가 막히지는 않아도 나름의 필요에 의한 압축 유틸리티를 만들어서 공개할 의사가 없다면, 개인용의 tar를 직접 고치든지, 그마저 귀찮으면 /usr/local/bin/compress 라는 링크를 제 유틸리티에 걸어놓고 (제 경우에) 지금은 거의 쓰지 않는 Z 옵션을 사용하고 싶을지도 모르겠습니다.

전 이래서 Unix가 좋습니다. :-)

--
"The love you take is equal to the love you make." The End, by Beatles

익명 사용자의 이미지

sio4 wrote:

...
특히나 pipe/redirection 이라는 것이 "Unix 의 아름다움"을 이야기할 때 빠지지 않고 등장하는, 또한 목록의 앞쪽에 배치되는 데에는 그만한 이유가 있을 것입니다.
...

공감합니다.
반론은 아니고요. 그냥 참고하세요.

*참고: 때에 따라서는 하나의 독립 바이너리로 동작하는것이 필요한 경우도 있답니다. 동작의 문제가 아니라, 재사용의 문제가 아니라, 프로그래밍 아트도 아니고, 서류상의 문제로 필요한 경우가 가끔 있습니다.
저는 일반적 사용으로는 아름다움을 추구하지만, 제품을 만들때는 반드시 그러하지는 않다는....

댓글 달기

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