• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 重定向輸入與輸出

    發表于:2007-05-25來源:作者:點擊數: 標簽:重定向大多數輸入輸出IDE
    大多數的IDE環境都具備這樣一種功能,加載編譯器編譯好程序并執行,執行結果顯示于IDE環境中的結果信息窗口,那么它是如何捕獲程序運行結果的呢?其實簡單地用dup/dup2重定位輸出并通過管道獲取該輸出就可以達到這種效果。 #include stdio.h #include unistd
    大多數的IDE環境都具備這樣一種功能,加載編譯器編譯好程序并執行,執行結果顯示于IDE環境中的結果信息窗口,那么它是如何捕獲程序運行結果的呢?其實簡單地用dup/dup2重定位輸出并通過管道獲取該輸出就可以達到這種效果。

    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/types.h>
    
    int
    main(int argc, char **argv)
    {
    int fd[2];
    pid_t childpid;

    if (pipe(fd) == -1)
    {
    printf("%s: %d -- Create pipe error: %s\n", __FILE__, __LINE__, strerror(errno));
    exit(errno);
    }

    childpid = fork();

    if (childpid == -1)
    {
    printf("%s: %d -- fork error: %s\n", __FILE__, __LINE__, strerror(errno));
    exit(errno);
    }

    if (childpid == 0)
    {
    close(fd[0]);

    if (dup2(fd[1], STDOUT_FILENO) == -1)
    {
    printf("%s: %d -- dup2 error: %s\n", __FILE__, __LINE__, strerror(errno));
    exit(errno);
    }

    if (execlp("ls", "ls", "/", NULL) == -1)
    {
    printf("%s: %d -- execlp error: %s\n", __FILE__, __LINE__, strerror(errno));
    exit(errno);
    }

    exit(0);
    }
    else { char buff[4096];

    close(fd[1]);
    memset(buff, sizeof(buff), 0);

    printf("read %d bytes\n", read(fd[0], buff, sizeof(buff)));
    printf("output: %s\n", buff);

    exit(0);
    }
    }

    以下代碼則相反,重定向輸入:
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    int
    main(int argc, char **argv)
    {
    int fd[2];
    pid_t childpid;

    if (pipe(fd) == -1)
    {
    printf("%s: %d -- Create pipe error: %s\n", __FILE__, __LINE__, strerror(errno));
    exit(errno);
    }

    childpid = fork();

    if (childpid == -1)
    {
    printf("%s: %d -- fork error: %s\n", __FILE__, __LINE__, strerror(errno));
    exit(errno);
    }

    if (childpid == 0)
    {
    close(fd[1]);
    if (dup2(fd[0], STDIN_FILENO) == -1)
    {
    printf("%s: %d -- dup2 error: %s\n", __FILE__, __LINE__, strerror(errno));
    exit(errno);
    }

    if (execlp("xargs", "xargs", "ls", NULL) == -1)
    {
    printf("%s: %d -- execlp error: %s\n", __FILE__, __LINE__, strerror(errno));
    exit(errno);
    }

    exit(0);
    }
    else { int status;

    close(fd[0]);
    write(fd[1], "/", 1);

    printf("waitpid result: %d\n", waitpid(childpid, &status, WNOHANG));
    printf("status value: %d\n", status);

    if (WIFEXITED(status))
    printf("child process was terminated normally by calling exit or _exit\n");
    else if (WEXITSTATUS(status))
    printf("returns the exit status of the child by exit or _exit\n");
    else if (WIFSIGNALED(status))
    printf("child process was terminated by a signal\n");
    else if (WTERMSIG(status))
    printf("returns the number of the signal that caused the child process to terminate\n");
    else if (WCOREDUMP(status))
    printf("child produced a core dump\n");
    else if (WIFSTOPPED(status))
    printf("child process was stopped by delivery of a signal\n");
    else if (WSTOPSIG(status))
    printf("retuns the number of the signal which caused the child to stop\n");
    else if (WIFCONTINUED(status))
    printf("child process was resumed by delivery of SIGCONT\n");
    exit(0);
    }
    }

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>