2

popen()シェルコマンドを実行してから出力を読み取るための適切な代替案を提案してください。

編集:fork()代替は呼び出しなしでなければなりません。私のサーバーはすでにメモリを大量に消費しているためです。次にffmpeg、メモリも必要であり、プロセスサイズが増加します!fork()毎回メモリウェイトサーバーに問題が発生します。

4

2 に答える 2

5

フォーク時に親プロセスのメモリをコピーする必要がある場合は、使用する必要があります。vfork()これは、親プロセスのメモリをコピーしないが、フォークされたプロセスがすぐに発行する必要がある「フォーク」の特別なバージョンですexecve()

于 2012-06-11T18:13:50.497 に答える
0

これは私が学校で教えられた方法です:

int main(int argc, char *argv[]) {

    int pipefd[2];
    pid_t cpid;
    char buf;


    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    cpid = fork();
    if (cpid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (cpid == 0) {
        /* Child reads from pipe */
        close(pipefd[1]);

        //make the standard input to be the read end
        pipefd[0] = dup2(pipefd[0], STDIN_FILENO);

        system("more");

        write(STDOUT_FILENO, "\n", 1);
        close(pipefd[0]);


    } else {

        /* Parent writes argv[1] to pipe */
        close(pipefd[0]);
        /* Close unused read end */

        pipefd[1] = dup2(pipefd[1], STDOUT_FILENO);

        system("ps aux");
        /* Wait for child */
        wait(NULL);
        exit(EXIT_SUCCESS);
    }

    return 0;
}

これにより、2つのプロセスが生成されます。1つは「psaux」を実行し、もう1つは「more」を実行しているプロセスに出力を供給します。

于 2012-06-11T17:17:52.777 に答える