popen 관련해 궁금한 점이 있습니다.

leesunghee47의 이미지

popen을 이용해 프로그램 상에서 mke2fs를 실행하려고 합니다

FILE *fp;

char buff[256];
fp = popen("mke2fs -F /dev/sda", "r");
if (fp == NULL)
{
perror("erro : ");
exit(0);
}

while(fgets(buff, 256, fp) != NULL)
{
printf("%s", buff);
}

state = pclose(fp);

이렇게 했을경우

mke2fs 1.38 (30-Jun-2005)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
39075840 inodes, 78142806 blocks
3907140 blocks (0.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=79691776
2385 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616

여기까지는 출력이 되는데요..

원하는 카운터 부분은 출력이 안되네요..

Writing inode tables: 17/2385 <== 이부분요//

어떻게 해야 출력이 가능할까요??

그리고 저 카운터를 계속 불러 오려면.. 어떻게 불러와야 하나요??

ggeagle의 이미지

언뜻 생각한 겁니다 ㅎㅎ

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

매일막걸리 한 병 = 상태메롱

shyblue의 이미지

한줄에 출력되는 문제가 255개니까 상관없겠지요.
fgets()로 buf에 255문자씩내로 읽어들이는건데.. 문제는 fgets는 bof문제가 있으니 쓰지 말라는 경고가 나올텐데...(뭐, 무시해도 상관은 없겠지만..). 이왕이면 readline과 같은 함수를 하나 구현해서 사용하시는것이 좋을것 같습니다.

일단, mke2fs.c 내용을 보면, 일반 출력과 다를바가 없어서, pipe로 출력이 흘러 들어올텐데.. 그 부분부터 확인해 보시는것이 어떨까요?
명시적 파이프를 하나 만들고, 그 파이프를 cat으로 출력하는 동시에, mke2fs를 실행해서 명시적 파이프로 출력해 보심이...

static void progress_init(struct progress_struct *progress,
                          const char *label,__u32 max)
{
        int     i;
 
        memset(progress, 0, sizeof(struct progress_struct));
        if (quiet)
                return;
 
        /*
         * Figure out how many digits we need
         */
        i = int_log10(max);
        sprintf(progress->format, "%%%dd/%%%dld", i, i);
        memset(progress->backup, '\b', sizeof(progress->backup)-1);
        progress->backup[sizeof(progress->backup)-1] = 0;
        if ((2*i)+1 < (int) sizeof(progress->backup))
                progress->backup[(2*i)+1] = 0;
        progress->max = max;
 
        progress->skip_progress = 0;
        if (getenv("MKE2FS_SKIP_PROGRESS"))
                progress->skip_progress++;
 
        fputs(label, stdout);
        fflush(stdout);
}
 
static void progress_update(struct progress_struct *progress, __u32 val)
{
        if ((progress->format[0] == 0) || progress->skip_progress)
                return;
        printf(progress->format, val, progress->max);
        fputs(progress->backup, stdout);
}
 
static void progress_close(struct progress_struct *progress)
{
        if (progress->format[0] == 0)
                return;
        fputs(_("done                            \n"), stdout);
}

이 부분이 mke2fs.c에서 진행사항을 출력하는 부분입니다. 참고하시기 바랍니다.

時日也放聲大哭

時日也放聲大哭

realhiro의 이미지

아이구 ㅠ_ㅜ

댓글 달기

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