[완료]popen 함수로 스크립트를 호출 했습니다.

voricha의 이미지

=================================================================================

if( ( fpid = popen( cmd, "r" ) ) == NULL )
{
_r = -1;
WriteLog("LINE[%2d] -> copy.sh::ERROR[%s]\n", nLine, cmd);
}
else
{
WriteLog("LINE[%2d] -> copy.sh[%s].. ok\n", nLine, cmd);
}
pclose( fpid );

=================================================================================

copy.sh ( 로컬 a 파일을 자신과 다른 서버( A, B )에 복사 하는 스크립트 입니다. )

cp a c --> a를 로컬서버 c로 복사합니다.
rcp a c --> a를 다른 A서버에 c로 복사합니다.
rcp a c --> a를 다른 B서버에 c로 복사합니다.
=================================================================================

어떤 펑션에서 위와 같이 popen를 열어 스크립트(copy.sh)를 실행 시킨후 바로 pclose를 합니다.

문제는 잘 되다가 어쩌다 한번씩 복사가 안됩니다. 로그를 보면 파이프를 열어 스크립트를 호출한거 같은데요.

이유가 뭘까요?? 혹시 스크립트를 호출하고 바로 파이프를 닫아서 그런건가요??

보통 한 파일을 다른 서버와 동기화 및 업데이트를 할때 어떤 식으로 구현 하시는 지 궁금 합니다.

panda005의 이미지

copy.sh의 출력을 저 프로그램이 사용해야할 경우가 아니라면,
그냥 system ()이나 execl ()계열의 함수를 호출해서 copy.sh을 실행하시면 될 것 같습니다.
거기서도 return값은 받을 수 있으니, 괜히 popen을 할 필요가 없을 것 같습니다.

voricha의 이미지

^^
댓글 감사드립니다.

알려 주신 방법으로도 가능하군요.. ^^

그런데 문제는 왜 위처럼 파이프로 호출했을때 가끔.. 아주 가끔.. 안되는지 이유를 모르겠습니다.

위에 알려 주신 system() 이나 execl() 의 함수를 썼을때 파이프로 호출한 현상이 안 나올까요??

왜 안되는지가 너무 궁금하네요 ^^

^^

panda005의 이미지

copy.sh의 환경을 정확히 몰라서 확신하기는 어렵지만,
copy.sh에서 pipe로 출력하는 값들이 있는데,
이게 제대로 읽히지 않은 상태에서 pclose를 하면,
copy.sh에서 SIGPIPE를 받아서 인터럽트에 의한 비정상 종료가 발생될 수 있습니다.

제가 테스트해본 결과는 다음과 같습니다.

<span>pipe.c</span>
<hr class="bb-hr" />
#include &lt;stdio.h&gt;
int
main ()
{
        FILE *fp = popen ("./sigpipe", "r");
        pclose (fp);
        return 0;
}

<span>sigpipe.c</span>
<hr class="bb-hr" />
#include &lt;signal.h&gt;
#include &lt;stdio.h&gt;
 
void
sigpipe (int signo)
{
        FILE *fp = fopen ("/tmp/sigpipe", "a");
        fputs ("receive SIGPIPE\n", fp);
        fclose (fp);
        exit (1);
}
 
int
main ()
{
        signal (SIGPIPE, sigpipe);
        fputc ('0', stdout);
        return 0;
}

<span>실행결과</span>
<hr class="bb-hr" />
$ gcc -o sigpipe sigpipe.c
$ gcc -o pipe pipe.c
$ ./pipe
$ cat /tmp/sigpipe
receive SIGPIPE
$
voricha의 이미지

^^
작업해 보니 파이프 단절이 생기네요 ㅎㅎ

그래서 파이프를 안쓰고 system을 쓰기로 했습니다.

단순 복사 스크립트라서요 ^^

^^

댓글 달기

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