파이프 라인과 리다이렉션 구현 질문입니다...

yanggak의 이미지

제가 쉘을 짜고 있는데요..
처음엔 숙제로 시작했는데...이제 다양한 구현을 하고 싶어서요..
지금은 단순히 패스 환경변수를 찾아서 패스들로 이루어진 배열을 만들었구요
커맨드 라인에서 명령을 입력받은 뒤에 각 명령들을 나누어서 배열에 저장하구요..
그리고 fork()해서 자식 프로세스로 명령어 인자값을 넘긴다음에..
그렇게 구현했거든요...저는 execv로 해서 자식프로세스를 실행시켰습니다..
(처음에 구현 조건이었거든요...--;)
이렇게 하다 보니...background jop 이라든지 sequential 하게 돌아가게끔..
또 pipe, >, <, >> 이런 기능을 구현하고 싶어요...
대충 파이프의 사용법도 알구요...대충 어떤식으로 돌아가는 지는 알겠는데..
지금 제가 짠 소스를 유지하면서 구현을 하려니깐 막막하네요...
저는 main()에서 자식프로세스를 실행시켰거든요...
위와 같은 구현을 하려면 따로 프로세스를 생성시키는 함수를 만들어야 겠죠?
진짜 궁금한 건요...한 command line에 여러개의 파이프와 리다이렉션 또는 background job으로 이루어지게끔 명령을 입력했다면...
여기서는 어떻게 해야되는 건지요..
제가 위에서도 말씀드렸지만...commad line을 읽어와서 배열에 넣는 부분에서 각각이 파이프인지 리다이렉션인지를 검사해서 일일이 프로세스를 실행시켜줘야 하나요?
또 execv를 사용했으니깐...파이프 이후에는 다시 처음부터 배열을 생성시켜야 될 것 같은데...
너무 주절주절 거렸나요? ^^;
정말~~~~~~~~~~궁금합니다.~~~~~~~~~
방향만 좀 일러주시면 안될까요? 고수님들의 명쾌한 답변 부탁드립니다..

cdpark의 이미지

일단 commandline parsing은 알아서(-_-) 하시리라 믿고요.

보통 fork() 후에 자식 프로세스는 exec..를 하고, 부모 프로세스는 wait를 합니다. 그런데 부모 프로세스가 wait를 하지 않고 제 할 일을 하면? 바로 이게 background job이죠.

prog > outfile

이건 자식 프로세스 쪽에서 exec..를 부르기 전에 close(1); open("outfile", "w"); 순으로 불러주면 됩니다. >>는 "w" 대신에 "a"로 불러줘야겠죠? <는 연습문제.

pipe는 좀 더 복잡합니다. pipe()란 시스템 함수와 dup()란 시스템 함수를 이용하면 됩니다. 이곳에 설명하는 것보다는 시스템 프로그래밍 책을 살펴보세요.

@ KLDP는 숙제를 대신 해 주는 곳이 아닙니다. :(

댓글 달기

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