Skip navigation


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.

#include <stdlib.h>
#include <unistd.h>

int main(){
	int fildes[2];
	const int BSIZE = 100;
	char buf[BSIZE];
	ssize_t nbytes;
	int status;
	status = pipe(fildes);
	switch (fork()) {
	case -1: /* Handle error */
	    break;

	case 0:  /* Child - reads from pipe */
	    close(fildes[1]);                       /* Write end is unused */
	    nbytes = read(fildes[0], buf, BSIZE);   /* Get data from pipe */
	    /* At this point, a further read would see end of file ... */
	    close(fildes[0]);                       /* Finished with pipe */
	    exit(EXIT_SUCCESS);

	default:  /* Parent - writes to pipe */
	    close(fildes[0]);                       /* Read end is unused */
	    write(fildes[1], "Hello world\n", 12);  /* Write data on pipe */
	    close(fildes[1]);                       /* Child will see EOF */
	    exit(EXIT_SUCCESS);
	}
}

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. Fungsi yang digunakan adalah fungsi dup() atau dup2().

dup2(fd1, fd2);

fd2 akan diclose terlebih dahulu, kemudian fd1 akan disalin ke fd2.

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.
Berikut adalah 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&#91;255&#93;;
            close(fildes&#91;0&#93;);
            dup2(fildes&#91;1&#93;, 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);
            }
        }
    }
}

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: