- 論壇徽章:
- 0
|
如何讓程序接收stdout管道的內(nèi)容?
自己改一下,看看是父進(jìn)程關(guān)閉stdin還是什么的.
下面的程序是打開一個(gè)輸入文件讀入后,通過管道寫入sort程序的標(biāo)準(zhǔn)輸入流,進(jìn)行排序.
相當(dāng)于shell代碼 cat <filename>; | sort,也就是匿名管道的應(yīng)用方法.
自己試著改一下吧.
- //將父進(jìn)程讀入的文件通過管道寫入到子進(jìn)程的標(biāo)準(zhǔn)輸入。
- // 創(chuàng)建了一個(gè)管道,并在子進(jìn)程中調(diào)用execl執(zhí)行了系統(tǒng)的排序程序sort
- //
- #include <stdio.h>;
- #include <unistd.h>;
- int main(int argc, char* argv[])
- {
- FILE* names; //輸入文件
- FILE* sort; //連接到sort的輸出文件
- int fd[2]; //管道的文件描述符
- int ch;
- if (argc != 2)
- {
- printf("使用方法: pipesort <輸入文件名>;\n");
- exit(1);
- }
- names = fopen(argv[1], "r");
- if (NULL == names)
- {
- perror("fopen");
- exit(1);
- }
- if (fork() == 0)
- {
- //子進(jìn)程代碼
- close(0); //關(guān)閉標(biāo)準(zhǔn)輸入文件描述符
- dup(fd[0]); //復(fù)制管道的輸入端到標(biāo)準(zhǔn)輸入
- close(fd[0]); //關(guān)閉多余的管道描述符
- close(fd[1]); //此處不使用管道的寫入端口
- execlp("sort", "sort", NULL);
- perror("execlp");
- exit(0);
- }
- //父進(jìn)程的代碼.
- close(fd[0]); //不使用管道的讀入端口.
- if (sort = fdopen(fd[1], "w") == NULL)
- {
- //無法打開管道寫入端
- perror("fdopen");
- exit(1);
- }
- //復(fù)制數(shù)據(jù)到sort程序
- while ((ch = getc(names)) != EOF)
- {
- putc(ch, sort);
- }
- fclose(names);
- fclose(sort);
- return (0);
- }
復(fù)制代碼 |
|