Is there a better way to do it?
int numOfCPU;
system(\"grep -c ^processor /proc/cpuinfo >> /tmp/cpuinfo\");
FILE *fp = fopen(\"/tmp/cpuinfo\", \"r\");
You need to use redirection and pipes to do what you are trying to do.
The popen call can help you, but if you want something more flexible, such as also redirecting input, or more secure, such as not running a string in the shell, you should follow this example, taking from the manual page of pipe.
#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);
}
}
You should modify the child process to use dup2 to redirect the standard output to the pipe and then exec the command you want it to run.
Using awk:
#include <stdlib.h>
#include <stdio.h>
void main()
{
int numOfCPU =0;
system ("awk '/processor/{numOfCPU++}END{print numOfCPU}' /proc/cpuinfo");
}
Ok, I was confused in my other answer. In any case, the philosophy in this answer is the same. You can use directly the popen function.
Then you have something like this:
int numOfCPU;
FILE *fp = popen("grep -c ^processor /proc/cpuinfo", "r");
fscanf(fp, "%d", &numOfCPU);
pclose(fp);
I hope it will be useful.