Minggu, 02 November 2014

Fungsi Pipe

Di dalam UNIX Command, sering dipakai tanda “|”. Tanda “|” adalah pipe, maksudnya stdout dari sebuah program dapat menjadi stdin dari program yang lain. Di dalam C, fitur ini dapat diimplementasikan dengan fungsi pipe(). Di contoh yang ada pada spesifikasi tersebut hanya menangani antara 2 proses.

Fungsi pipe ini akan menyambungkan input dari sebuah filedescriptor menjadi output pada filedescriptor lain. Input/output ini dibaca dengan menggunakan fungsi read() dan write().

Pipe juga dapat digunakan untuk stdin dan stdout layaknya pada penggunaan pipe pada terminal UNIX. Caranya adalah menduplikasikan file descriptor pipe tersebut ke dalam file descriptor dari stdout atau stdin.
Pada penggunaan terminal UNIX sehari-hari sering ditemukan runtunan seperti
$ ls | grep "tes" | less
Untuk penggunaan, file descriptor yang sudah dibuat pada pipe dapat digunakan kembali saat proses yang menggunakannya difork. Jadi tidak perlu langsung diclose. Kodenya:


#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
 
int main()
{
    int i;
    int fildes[2];
    int fdinput = -1;
    for (i = 0; i < 10; i++) {
        pipe(fildes);
        pid_t childpid = fork();
        if (childpid == 0) {
            /* Write */
            char b[255];
            close(fildes[0]);
            dup2(fildes[1], STDOUT_FILENO);
            if (fdinput >= 0) dup2(fdinput, STDIN_FILENO);
            scanf("%s", b);
            printf("c%s");
            close(fildes[1]);
            if (fdinput >= 0) close(fdinput);
            exit(EXIT_SUCCESS);
        }
        else if (childpid > 0) {
            char a[255];
            close(fildes[1]);
            fdinput = fildes[0];
            if (i == 9) {
            dup2(fildes[0], STDIN_FILENO);
            scanf("%s", a);
            printf("%s\n", a);
            }
        }
    }
}

Tidak ada komentar:

Posting Komentar