pipe와 fifo에 관한 질문입니다.

hmd7932의 이미지

네트워크 프로그래밍 공부 중 질문이 있어 고수님들께 질문 올립니다.

프로세스간의 통신 방법 중 Pipe 부분을 공부하고 있습니다.

여기 설명으로는 ps -aux | grep httpd | wc -l를 예로 들면서
ps의 표준 출력을 grep의 표준 입력으로, grep의 표준출력을 wc의 표준 입력으로 연결한다라고 되어있고
Pipe는 부모 자식 프로세스 간에만 통신이 가능하다고 하고 fifo를 통해서 다른 프로세스간의 통신을 한다라고 되어있습니다.

ps -aux | grep httpd | wc -l에서 ps, grep, wc는 /bin에 있는 서로 다른 프로그램을 실행시킨 프로세스 들인데

위 명령어를 치면 리눅스 운영체제에서 ps를 부모로 하고 exec 함수를 통해 grep이라는 자식을, grep은 exec를 통해 wc를 실행시킨 구조로 되어있다는건가요?

근데 또 그럼 이해가 안가는게 exec 함수라면 ps만 실행되고 끝나버릴텐데 말이죠...

말이 잘 정리가 안되는데, 요점은 리눅스에서 "|"연산자는 fifo로 동작하는 것인지, 아니면 pipe로 동작하는 것인지입니다.

감사합니다.

hmd7932의 이미지

추가를 하려고 했는데 수정을 어떻게 하는지 몰라서...

ps -aux | grep httpd | wc -l 과 같이 했을 때

제 추측
-bash 에서 명령어 파싱 후 fifo를 생성, ps의 표준 출력을 grep의 표준 입력으로, grep의 표준 출력을 wc의 표준 입력으로 연결

맞나요? 어렵네요 ㅜㅜ

jick의 이미지

fifo를 쓸 필요는 없습니다. (다음은 하나의 예시일 뿐이고 꼭 이 순서대로 동작할 거라는 얘기는 아닙니다.)

ps -aux | grep httpd | wc -l 이라면,

(1) shell이 fork. 원래 프로세스는 그냥 하던 일 계속 하고 자식 프로세스가 아래의 작업 진행.
(2) pipe 1 생성
(3) 한번 더 fork
(3-1) 자신이 부모 프로세스이면 pipe 1의 쓰기 fd를 닫고 읽기 fd를 stdin에 연결한 뒤 exec "wc -l" 실행
(3-2) 자신이 자식 프로세스이면 다시 아래의 작업 진행
(4) pipe 1의 읽기 fd를 닫고 쓰기 fd를 stdout에 연결
(5) pipe 2 생성
(6) 또 한번 fork
(7-1) 자신이 부모 프로세스이면 pipe 2의 쓰기 fd를 닫고 읽기 fd를 stdin에 연결한 뒤 (stdout은 이미 pipe 1에 연결되어 있음) exec "grep httpd" 실행
(7-2) 자신이 자식 프로세스이면... 뭐 할지 알겠죠?

댓글 달기

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