popen()
シェルコマンドを実行してから出力を読み取るための適切な代替案を提案してください。
編集:fork()
代替は呼び出しなしでなければなりません。私のサーバーはすでにメモリを大量に消費しているためです。次にffmpeg
、メモリも必要であり、プロセスサイズが増加します!fork()
毎回メモリウェイトサーバーに問題が発生します。
フォーク時に親プロセスのメモリをコピーする必要がある場合は、使用する必要があります。vfork()
これは、親プロセスのメモリをコピーしないが、フォークされたプロセスがすぐに発行する必要がある「フォーク」の特別なバージョンですexecve()
。
これは私が学校で教えられた方法です:
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」を実行しているプロセスに出力を供給します。