[완료]조심스레 질문해 봅니다. - 리눅스 프로그래밍 관련

ilmioben의 이미지

답답한 심정에 글을 올리지만 이 곳 분위기에 주눅들어 살짝 겁도 나네요.

사설은 이만하고 본론으로 들어가겠습니다.

제가 구현하고자 하는 것은 리눅스 명령어 top의 구현입니다.
현재 top과 같은 일을 하는 프로그램을 만들었습니다.

구현한 시나리오는 이렇습니다.
1. /proc 밑에 있는 번호로 된 폴더(디렉토리라고 하나요;; 리눅스를 잘 몰라서;;)만 골라서 그안의 정보를 링크드 리스트로 저장해 (1)번 포인터가 그 링크드 리스트의 시작점을 가리키게 했습니다. 프로세스의 정보가 들어 있는 /proc/[number]/stat에서 정보를 가져왔습니다.

2. /proc 밑에 있는 번호로 된 폴더(디렉토리라고 하나요;; 리눅스를 잘 몰라서;;)만 골라서 그안의 정보를 링크드 리스트로 저장해 (2)번 포인터가 그 링크드 리스트의 시작점을 가리키게 했습니다. 프로세스의 정보가 들어 있는 /proc/[number]/stat에서 정보를 가져왔습니다.

3. (1),(2)를 비교하여 새로 생성된 것이 있으면 생성되었다고 출력, 후에 (1) 링크드 리스트에 붙입니다. 없어진 것이 있으면 없어졌다고 출력, 후에 (1) 링크드리스트에서 제거 합니다.

4. (2) 번을 free시킵니다.( 만들때 malloc으로 만들어서;;)

5. 2. 번으로 돌아갑니다.

이렇게 계속해서 검색하면서 생성된 프로세스와 죽은 프로세스를 화면에 출력해줍니다.

여기서 1가지 의문점이 발생하였습니다.

3.번 과정 비교하는 과정에서 한 프로세스(procA)가 생성되고 소멸 되었다면 3번 과정이 끝나고 4.번을 거쳐 다시 2번 과정에서 (2) 링크드 리스트를 만드는데요
이미 procA는 재빨리 생성, 소멸 되었기 때문에 저는 procA에 대한 정보를 잡아내지 못하게 됩니다.

여기서 질문인데요

프로세스 생성, 소멸시에 제가 그 것을 알 수 있는 방법이 /proc 밑의 프로세스 번호를 통해서밖에 알 수 없을까요? 만약 있다면 어떤 방법이 있을지 힌트라도 좀 주시면 감사하겠습니다.

bushi의 이미지

이론적으로만 알고 있고 실제로 사용해 본 적은 없는 것이라 좀 찜찜하긴 하지만...

커널 config 에 CONFIG_CONNECTOR, CONFIG_PROC_EVENTS 가 포함될 경우
netlink 메시지를 통해 exec, fork, exit 등의 이벤트를 받아볼 수 있습니다.
(fork 일 경우 parent 의 pid 까지도 알 수 있습니다.)

커널 측의 구현은 drivers/connector/cn_proc.c 에 있습니다.

덧,
fedora 의 커널은 둘 다 built-in 으로 컴파일 되어 있지만, 다른 배포본은 모르겠습니다.

덧,
호기심에 검색 좀 해봤습니다. cn_proc 을 사용하는 응용프로그램 예제는 http://www.suse.de/~krahmer/exec-notify.c

메인트리엔 없지만 filesystem event 와 network event 까지 CONNECTOR 로 날리기 위한 커널 패치들도 보이더군요. 관심있으신 분들은 참고해보세요.

OTL

semtul79의 이미지

실제 top 명령어는

주기적으로 실행되는걸로 알고있습니다.

님께서 만드신 부분이 일단 top 의 기본 조건을 다 하신것 같고요..

순간적으로 생겼다가 사라지는 것은 top 도 잡아내지 못할겁니다.
(이게 된다면 top 소스 분석하면 될듯..)

프로세스 생성,소멸에 대해 모두 알려고 하면
위의분 처럼..
고레벨(?)의 작업을 하셔야 할듯하네요..그럼~~

ilmioben의 이미지

답변 감사합니다.
현재 제가 일반계정밖에 부여받지 못해 답변대로 하지는 못하고,
결국 제가 한 것 내에서 끝을 맺게 되었습니다.

댓글 달기

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