11

それを行うより良い方法はありますか?

int numOfCPU;
system("grep -c ^processor /proc/cpuinfo >> /tmp/cpuinfo");
FILE *fp = fopen("/tmp/cpuinfo", "r");
fscanf(fp, "%d", &numOfCPU);
fclose(fp);
system("rm /tmp/cpuinfo");

中間ファイルを作成して削除したくありません。

編集:

ファイルからの読み取りではありません。コマンドは「ls」または「echo 'Hello world'」です。

4

3 に答える 3

20

わかりました、私は他の答えで混乱しました。いずれにせよ、この回答の哲学は同じです。popen関数を直接使用できます。

次に、次のようなものがあります。

int numOfCPU;
FILE *fp = popen("grep -c ^processor /proc/cpuinfo", "r");

fscanf(fp, "%d", &numOfCPU);
pclose(fp);

役に立つことを願っています。

于 2013-06-14T11:41:28.000 に答える
4

やろうとしていることを行うには、リダイレクトとパイプを使用する必要があります。

popen呼び出しは役に立ちますが、入力をリダイレクトするなど、より柔軟なものが必要な場合や、シェルで文字列を実行しないなど、より安全なものが必要な場合は、パイプのマニュアルページから取得したこの例に従う必要があります。

   #include <sys/wait.h>
   #include <stdio.h>
   #include <stdlib.h>
   #include <unistd.h>
   #include <string.h>

   int
   main(int argc, char *argv[])
   {
       int pipefd[2];
       pid_t cpid;
       char buf;

       if (argc != 2) {
        fprintf(stderr, "Usage: %s <string>\n", argv[0]);
        exit(EXIT_FAILURE);
       }
       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]);          /* Close unused write end */

           while (read(pipefd[0], &buf, 1) > 0)
               write(STDOUT_FILENO, &buf, 1);

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

       } else {            /* Parent writes argv[1] to pipe */
           close(pipefd[0]);          /* Close unused read end */
           write(pipefd[1], argv[1], strlen(argv[1]));
           close(pipefd[1]);          /* Reader will see EOF */
           wait(NULL);                /* Wait for child */
           exit(EXIT_SUCCESS);
       }
    }

子プロセスを変更して、dup2 を使用して標準出力をパイプにリダイレクトしてから、実行するコマンドを実行する必要があります。

于 2013-06-14T11:51:07.387 に答える
-1

awk の使用:

#include <stdlib.h>
#include <stdio.h>

void main()
{
    int numOfCPU =0;

    system ("awk '/processor/{numOfCPU++}END{print numOfCPU}' /proc/cpuinfo");
}
于 2013-06-14T12:40:52.327 に答える