exec을 실행시킨 프로세스가 바로 죽어버립니다..

tokyo9pm의 이미지

웹 브라우저에서 터미널처럼 동작할 수 있게 만들고 싶어서

동작 부분만 우선 생각나는 방식대로 짜본다고 짰는데 잘 안되네요

코드에서 보면 포크 시켜서 파이프랑 표준입출력 연결시키고 exec으로 sh를 실행시키고 있고

부모프로세스에서는 스레드 2개를 만들고 있습니다. 저 스레드는 각각 루프돌면서 sh에 입력만 / sh의 출력만 받아오는 역할입니다.

원하는 대로 동작하지 않아서 무엇이 문제인가 봤는데 포크까지는 올바른 흐름대로 가는데

자식 프로세스에서 분명 exec함수가 정상적으로 실행은 됩니다. 근데 실행되자마자 죽어버립니다.

부모 프로세스는 스레드 동작까지 잘 하는데 쓰기 읽기 파이프의 대상이 되는 자식 프로세스가 존재하지 않으니

당연히 SIGPIPE를 받습니다... 무엇이 문제일까요? fork()보다 윗부분은 파이프 생성밖에 없어서 안올렸습니다.

아 그리고 혹시 웹 터미널 관련해서 조언같은게 혹시 있다면 부탁드리겠습니다.

현재 목표는 웹서버부터 직접 올리는게 목표입니다. 보통 아파치 같은 서버를 이용하고 php를 통해 구동시키는 것 같은데,

간단한 웹서버를 통해 C로 돌릴수 있지 않을까 싶어 진행중입니다.

            if(pid < 0)
    36      {
    37          perror("fork err");
    38          exit(1);
    39      }
    40      else if(pid == 0)
    41      {
    42          close(0);
    43          close(1);
    44          dup2(w_pipe[0], 0);
    45          close(w_pipe[0]);
    46          close(w_pipe[1]);
    47
    48          dup2(r_pipe[1], 1);
    49          close(r_pipe[0]);
    50          close(r_pipe[1]);
    51
    52          execl("/bin/sh", "sh", NULL);
    53
    54          fprintf(stderr, "fail exec\n");
    55          exit(0);
    56      }
    57      else
    58      {
    59          waitpid(-1, NULL, WNOHANG);
    60
    61          close(w_pipe[0]);
    62          close(r_pipe[1]);
    63
    64          if(pthread_create(&tid1, NULL, (void *)read_bash, NULL)  == -1)
    65          {
    66              printf("p_c fail\n");
    67          }
    68          if(pthread_create(&tid2, NULL, (void *)write_bash, NULL)  == -1)
    69          {
    70              printf("p_c fail\n");
    71          }
    72
    73          pthread_join(tid1, NULL);
    74          pthread_join(tid2, NULL);
    75      }
yukariko의 이미지

원래 exec함수를 실행하면
함수종료시 프로세스도 함께 종료됩니다.
그래서 fork를 통해 자식프로세스에서 호출하는것이죠.
원하는결과를 받아오고싶다면 redirection을 이용하는방법이 있겠네요

tokyo9pm의 이미지

해당 프로세스가 exec의 인자로 넘긴 그 자체로 변하면서, 해당 기능 종료시 당연히 프로세스 종료되는 것은 알고 있습니다.

인자로 넘긴 sh나 bash가 실행된 다음 따로 종료 명령을 주거나 하지 않으면 계속 돌아가는 프로세스 아닌가요?

이거 직전에 확인차 짰던 코드가 기억나지 않지만 write파이프로 명령어 하나 넘기고 read로 결과 받아오는 것까지 했던 것 같은데

단순히 제가 착각한 것인가요?

댓글 달기

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