C言語 - 標準入力をパイプする popen - 標準入力をパイプする
1. ソース > ls -la 合計 36K drwxr-xr-x 2 kitayama kitayama 512 5月 18 11:14 . drwxr-xr-x 4 kitayama kitayama 512 5月 18 09:42 .. -rw-r--r-- 1 kitayama kitayama 129 5月 18 09:54 Makefile -rwxr-xr-x 1 kitayama kitayama 11246 5月 18 11:14 popen -rw-r--r-- 1 kitayama kitayama 499 5月 18 11:14 popen.c -rw-r--r-- 1 kitayama kitayama 6648 5月 18 11:14 popen.o という状況で ./popen.c を作成して以下のように記述。 #include <stdio.h> #define MAX_LINE 100 #define MAX_BUFF 2048 int main(int argc, char* argv[]) { char a[100][2048] = {}; int i; FILE *file = NULL; file = popen("ls -la", "r"); if (file == NULL) { perror(""); return 0; } for (i=0; i<MAX_LINE; i++) { if (fgets(a[i], sizeof(a[0]), file) == EOF) { break; } } pclose(file); for (i=0; i<MAX_LINE; i++) { if (a[i][0] == '\0') { break; } printf("%s", a[i]); } return 0; } 2. Makefile ./Makefile を作成して以下のように記述。 .PHONY = target CC = clang target : popen.o Makefile $(CC) -O0 -g -o popen popen.o .c.o : Makefile $(CC) -O0 -g -c $< -o $@ 3. 実行 make して実行します。 > make clang -O0 -g -o popen popen.o > ./popen total 36 drwxr-xr-x 2 kitayama kitayama 512 5月 18 11:26 . drwxr-xr-x 4 kitayama kitayama 512 5月 18 09:42 .. -rw-r--r-- 1 kitayama kitayama 129 5月 18 09:54 Makefile -rwxr-xr-x 1 kitayama kitayama 11246 5月 18 11:26 popen -rw-r--r-- 1 kitayama kitayama 499 5月 18 11:14 popen.c -rw-r--r-- 1 kitayama kitayama 6648 5月 18 11:14 popen.o
> ls -la 合計 36K drwxr-xr-x 2 kitayama kitayama 512 5月 18 11:14 . drwxr-xr-x 4 kitayama kitayama 512 5月 18 09:42 .. -rw-r--r-- 1 kitayama kitayama 129 5月 18 09:54 Makefile -rwxr-xr-x 1 kitayama kitayama 11246 5月 18 11:14 popen -rw-r--r-- 1 kitayama kitayama 499 5月 18 11:14 popen.c -rw-r--r-- 1 kitayama kitayama 6648 5月 18 11:14 popen.o
./popen.c
#include <stdio.h> #define MAX_LINE 100 #define MAX_BUFF 2048 int main(int argc, char* argv[]) { char a[100][2048] = {}; int i; FILE *file = NULL; file = popen("ls -la", "r"); if (file == NULL) { perror(""); return 0; } for (i=0; i<MAX_LINE; i++) { if (fgets(a[i], sizeof(a[0]), file) == EOF) { break; } } pclose(file); for (i=0; i<MAX_LINE; i++) { if (a[i][0] == '\0') { break; } printf("%s", a[i]); } return 0; }
./Makefile
.PHONY = target CC = clang target : popen.o Makefile $(CC) -O0 -g -o popen popen.o .c.o : Makefile $(CC) -O0 -g -c $< -o $@
> make clang -O0 -g -o popen popen.o > ./popen total 36 drwxr-xr-x 2 kitayama kitayama 512 5月 18 11:26 . drwxr-xr-x 4 kitayama kitayama 512 5月 18 09:42 .. -rw-r--r-- 1 kitayama kitayama 129 5月 18 09:54 Makefile -rwxr-xr-x 1 kitayama kitayama 11246 5月 18 11:26 popen -rw-r--r-- 1 kitayama kitayama 499 5月 18 11:14 popen.c -rw-r--r-- 1 kitayama kitayama 6648 5月 18 11:14 popen.o