Cari Blog Ini

0 FUSE

Sabtu, 28 November 2015
Yakk kali ini saya akan membahas tentang FUSE.Sebelumnya apa sih FUSE itu? Mungkin banyak orang yang sudah paham pengertian dari fuse.Filesystem in Userspace (FUSE) merupakan mekanisme sistem operasi untuk sistem
operasi Unix-like yang memungkinkan pengguna tidak ber-hak istimewa menciptakan filesystem mereka sendiri tanpa mengubah kode kernel.Hal ini dicapai dengan menjalankan kode file system di userspace, sedangkan modul FUSE hanya menyediakan "jembatan" untuk antarmuka kernel yang sebenarnya.

Cara menginstall dan menjalankan Fuse :
1. Download installer di http://fuse.sourceforge.net/
2. ekstrak hasil download
3. dari terminal masuk ke direktori hasil download nya
4. ketik ./configure, enter
5. ketik make dan enter
6. ketik make install dan tekan enter

Berikut ini salah satu contoh simple codingan menggunakan fuse.Jadi kita buat sebuah folder baru(semisal : simpanan).
Jika file yang dibuka adalah file di dalam folder simpanan (file hasil editan), maka akan muncul pesan error berisi File yang anda buka adalah file hasil editan. FIle tidak bisa diubah maupun disalin kembali!” dan file tersebut tidak akan terbuka.

Codingan :
#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <syslog.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include <sys/statfs.h>
#include <sys/types.h>
#include <sys/stat.h>

static const char *dirpath = "/home/bn/Downloads/file";

static int xmp_getattr(const char *path, struct stat *stbuf)
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    res = lstat(fpath, stbuf);

    if(res == -1)
    {
        return -errno;
    }

    return 0;
}

static int xmp_chmod(const char *path, mode_t mode)
{
    int res;
    char fpath[1000];
    char direktori[] = "/home/bn/Downloads/file/simpanan";
    //sprintf(fpath,"%s%s", dirpath, path);
    sprintf(fpath,"%s%s", direktori, path);
    res = chmod(fpath, mode);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_chown(const char *path, uid_t uid, gid_t gid)
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s", dirpath, path);
    res = lchown(fpath, uid, gid);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_getdir(const char *path, fuse_dirh_t h, fuse_dirfil_t filler)
{
    char fpath[1000];
    if(strcmp(path,"/") == 0)
    {
        path=dirpath;
        sprintf(fpath,"%s",path);
    }
    else sprintf(fpath, "%s%s",dirpath,path);
    int res = 0;
    DIR *dp;
    struct dirent *de;
    dp = opendir(fpath);
    if(dp==NULL)
    {
        return -errno;
    }
    while((de = readdir(dp))!=NULL)
    {
        res = filler(h, de->d_name, de->d_type);
        if(res!=0) break;
    }
    closedir(dp);
    return res;
}

static int xmp_mkdir(const char *path,mode_t mode)
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    res = mkdir (fpath,mode);
    if(res == -1)
        return -errno;
    return 0;
}

static int xmp_symlink(const char *from, const char *to)
{
    int res;
 char ffrom[1000];
 char fto[1000];
 sprintf(ffrom,"%s%s",dirpath,from);
 sprintf(fto,"%s%s",dirpath,to);
    res = symlink(ffrom, fto);
    if(res == -1)
        return -errno;

    return 0;
}

/*static int xmp_link(const char *from, const char *to)
{
    int res;
    char ffrom[1000];
    char fto[1000];
    sprintf(ffrom,"%s%s",dirpath,from);
    sprintf(fto,"%s%s",dirpath,to);
    res = link(ffrom, fto);
    if(res == -1)
        return -errno;

    return 0;
}*/

static int xmp_unlink(const char *path)
{
    int res;
 char fpath[1000];
 sprintf(fpath,"%s%s", dirpath, path);
    res = unlink(fpath);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_truncate(const char *path, off_t size)
{
    int res;
     char fpath[1000];
 sprintf(fpath,"%s%s", dirpath, path);
    res = truncate(fpath, size);
    if(res == -1)
        return -errno;

    return 0;
}

/*static int xmp_utime(const char *path, struct utimbuf *buf)
{
    int res;
     char fpath[1000];
 sprintf(fpath,"%s%s", dirpath, path);
    res = utime(fpath, buf);
    if(res == -1)
        return -errno;

    return 0;
}*/

static int xmp_mknod(const char *path, mode_t mode, dev_t rdev)
{
    int res;
 char fpath[1000];
 sprintf(fpath,"%s%s", dirpath, path);
    res = mknod(fpath, mode, rdev);
    if(res == -1)
        return -errno;

    return 0;
}
//no2

static int xmp_open(const char *path, int flags)
{
    int res;

    //---
    char fpath[1000];
    char path2[1000];
    char path3[1000];
    sprintf(fpath,"%s%s", dirpath, path);
    sprintf(path2,"%s%s","/home/bn/Downloads/file",path);

    if(!strncmp(path,"/simpanan",9) && strcmp(path,"/simpanan/.fuse_hidden0000001200000001") && strcmp(path,"/simpanan/.fuse_hidden0000000900000001") && strcmp(path,"/simpanan/.fuse_hidden0000000c00000002"))
    {
        sprintf(path3,"%s%s","chmod 000 ",path2);
        system(path3);
        char temp[]="zenity --info --text=\"";
                strcat(temp,path);
                strcat(temp," File Tidak Bisa Dibuka ");
                strcat(temp,"\"");
                system(temp);
    }
    //---

    res = open(fpath, flags);
    if(res == -1)
        return -errno;

    close(res);
    return 0;
}


static int xmp_read(const char *path, char *buf, size_t size, off_t offset)
{
    int fd;
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s", dirpath, path);
    fd = open(fpath, O_RDONLY);
    if(fd == -1)
        return -errno;

    res = pread(fd, buf, size, offset);
    if(res == -1)
        res = -errno;

    close(fd);
    return res;
}

static int xmp_write(const char *path, const char *buf, size_t size,
                     off_t offset)
{
    int fd;
    int res;
 char fpath[1000];
 sprintf(fpath,"%s%s", dirpath, path);
    fd = open(fpath, O_WRONLY);
    if(fd == -1)
        return -errno;

    res = pwrite(fd, buf, size, offset);
    if(res == -1)
        res = -errno;

    close(fd);
    return res;
}


//no1
static int xmp_rename(const char *from, const char *to)
{
    int res;
    char ffrom[1000];
    char fto[1000];

    //---
    system("mkdir /home/bn/Downloads/file/simpanan");
    char direktori[] = "/home/bn/Downloads/file/simpanan";
    //---

    sprintf(ffrom,"%s%s",dirpath,from);
    sprintf(fto,"%s%s",direktori,to);
    res = rename(ffrom, fto);

    if(res == -1)
    return -errno;

    return 0;
}
//system("zenity --error --text=\"An error occurred!\" --title=\"Warning!\"");

static struct fuse_operations xmp_oper =
{
    .getattr = xmp_getattr,
    //.readlink = xmp_readlink,
    .getdir = xmp_getdir,
    .mknod = xmp_mknod,
    .mkdir = xmp_mkdir,
    .symlink = xmp_symlink,
    .unlink = xmp_unlink,
    //.rmdir = xmp_rmdir,
    .rename = xmp_rename,
    //.link = xmp_link,
    .chmod = xmp_chmod,
    .chown = xmp_chown,
    .truncate = xmp_truncate,
    //.utime = xmp_utime,
    .open = xmp_open,      //no2
    .read = xmp_read,
    .write = xmp_write,
    //.release = xmp_release,
    //.fsync = xmp_fsync,
    //.readdir = hello_readdir
};

int main(int argc, char *argv[])
{
    return fuse_main(argc, argv, &xmp_oper);
}

cara compile :
1. Buka terminal (Ctrl+alt+t)
2. Ketik gcc -Wall [nama_file].c  `pkg-config fuse --cflags --libs` -o [nama_objek] lalu tekan enter.
3. Ketik ./[nama_objek] tmp. Tekan enter
4. Explore lalu buka drive yang telah dimount. Di sini bernama tmp
5. Copy file teks lalu edit. File tersebut nantinya akan pindah ke folder simpanan 
5. Buka file yang ada dalam folder simpanan.Maka akan muncul pop-up error.
Sekian.. Selamat mencoba.



Read more

0 Masih Linux || Thread dan IPC

Sabtu, 07 November 2015


Setelah dalam postingan sebelumnya saya menjelaskan tentang proses,kali ini saya akan menjelaskan thread dan IPC.Sudah paham kan apa yang dimaksud proses?? Bila belum coba lihat postingan saya sebelumnya. Hehehe.
Jadi dalam sebuah proses terdapat bagian kecil atau proses ringan(lightweight) yang biasa disebut thread. Dalam sebuah proses ada yang menggunakan satu thread saja dan ada yang menggunakan lebih dari satu thread.Proses yang melibatkan hanya satu thread tersebut disebut single threading.Biasanya fungsi dari thread ini sebagai pengendali jalannya sebuah proses.ada juga dalam sebuah proses yang terdiri dari beberapa thread atau biasa disebut multi-threading.Jad thread dalam proses tersebut dapat berjalan beriringan menjalankan tugas masing-masing sehingga proses menjadi lebih cepat.Berikut ini adalah library yang digunakan untuk membuat thread  :

Selanjutnya yang akan saya bahas yaitu IPC.IPC adalah singkatan dari Interprocess communication .Sesuai dengan namanya jadi setiap proses yang ada dalam komputer bisa saling berkomunikasi layaknya kita sebagai manusia yang bisa saling berkomunikasi dengan sesama(asakan saling mengetahui bahasanya ya!!).Kalau tidak saling tahu bahasa nya minimal bisa menggunakan bahasa isyarat lah untuk saling bertukar informasi.Dalam tukar informasi pada komputer sendiri ada beberapa algoritma , antara lain yang populer yaitu :

a. Pipes
Pipe merupakan komunikasi sequensial antar proses yang saling terelasi.
b. Message Queue
Sistem berkirim pesan adalah proses komunikasi antar bagian sistem untuk
membagi variabel yang dibutuhkan.
c. Shared Memory
Sistem Berbagi Memori merupakan salah satu cara komunikasi antar proses dengan cara mengalokasikan suatu alamat memori untuk dipakai berkomunikasi antar proses. Pada metode ini, sistem akan mengatur proses mana yang akanmemakai memori pada waktu tertentu sehingga pekerjaan dapat dilakukan secara efektif.
d. Socket
Bentuk dari komunikasi yaitu UDP dan TCP menggunakan abstraksi socket yang menyediakan endpoint untuk komunikasi antar proses. Socket bisa dijalankan di berbagai platform(BSD UNIIX, UNIX, Linux, Windows, & Machintos OS).

Salah satu algoritma IPC yang saya jelaskan kali ini yaitu shared memory.Langsung saja kita buat contoh program yang melibatkan algoritma shared memory.Di sini kita buat program ibaratnya transaksi jual beli.Jadi kita buat satu source code dalam c sebagai penjualnya dan kita buat lagi satu untuk pembelinya.Nantinya dari kedua source code tadi kita jalankan melalui 2 terminal.Adapun langkah-langkahnya sebagai berikut :
1.Buat file source code untuk penjual :
Berikut source code nya :
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>

#define SHSIZE 144
#define JMLBRG 6

typedef struct oink{
            char nama[15];
            int stok;
} jual;

int main(int argc, char *argv[])
{
            int i,jumlah,opt;
            char nama[15];
            jual *barang;
           
            jual *shm,*temp;
            int shmid;
            key_t key;
            long unsigned int jualsize;
           
            jualsize = sizeof(jual);
            key=9876;
           
            shmid=shmget(key,SHSIZE,IPC_CREAT|0666);
            if(shmid<0)
            {
                        perror("shmget");
                        exit(1);
            }         
           
            shm=shmat(shmid,NULL,0);
            if(shm==(jual *) -1)
            {
                        perror("shmat");
                        exit(1);
            }
           
            temp=shm;
            barang=(jual*)malloc(jualsize);
            barang->stok=0;
            for(i=0;i<JMLBRG;i++){
                        if(i==0) strcpy(barang->nama,"RAM");        
                        else if(i==1) strcpy(barang->nama,"Harddisk");
                        else if(i==2) strcpy(barang->nama,"Motherboard");
                        else if(i==3) strcpy(barang->nama,"PSU");
                        else if(i==4) strcpy(barang->nama,"VGA");
                        else if(i==5) strcpy(barang->nama,"Processor");
                        memcpy(temp,barang,jualsize);
                        temp+=jualsize;                      
            }
           
           
            system("clear");
            while(1){
                        printf("=================================\n\n");
                        printf("1) Lihat stok\n");
                        printf("2) Tambah stok\n");
                        printf("Masukkan pilihan : ");
                        scanf("%d",&opt);
                        system("clear");
                        if(opt==1){
                                    temp=shm;
                                    for(i=0;i<JMLBRG;i++){
                                                printf("%s : %d buah\n",temp->nama,temp->stok);
                                                temp+=jualsize;
                                    }
                        }
                        else if(opt==2){
                                    printf("Tambah stok barang\n");
                                    printf("Masukkan nama : ");
                                    scanf("%s",nama);
                                    temp=shm;
                                    for(i=0;i<JMLBRG && strcmp(temp->nama,nama);i++){
                                                temp+=jualsize;
                                    }
                                    if(i==JMLBRG) printf("%s tidak tersedia\n",nama);            
//                                  printf("%d %s\n",temp->stok,temp->nama);
                                    else {
                                                printf("Masukkan jumlah : ");
                                                scanf("%d",&jumlah);
                                                (temp->stok)+=jumlah;
                                                printf("Selamat, %d %s berhasil ditambahkan. Stok %s adalah %d buah.\n",jumlah,nama,nama,temp->stok);
                                    }
                        }
                        else if(opt==3){
                                    exit(1);
                        }
                        else printf("Masukan salah");
                        printf("\n");
            }

            return 0;
}

2. Buat file source code untuk pembeli :
Berikut source code nya :
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>

#define SHSIZE 144
#define JMLBRG 6

typedef struct oink{
            char nama[15];
            int stok;
} jual;

int main(int argc, char *argv[])
{
            int i,jumlah,opt,cek;
            char nama[15];
           
            jual *shm,*temp;
            int shmid;
            key_t key;
            long unsigned int jualsize;
           
            jualsize = sizeof(jual);
            key=9876;

            shmid=shmget(key,SHSIZE,0666);
            if(shmid<0)
            {
                        perror("shmget");
                        exit(1);
            }         
           
            shm=shmat(shmid,NULL,0);
            if(shm==(jual *) -1)
            {
                        perror("shmat");
                        exit(1);
            }
           
            system("clear");
            while(1){
                        printf("=================================\n\n");
                        printf("1) Lihat barang\n");
                        printf("2) Beli barang\n");
                        printf("Masukkan pilihan : ");
                        scanf("%d",&opt);
                        system("clear");
                        if(opt==1){
                                    cek=0;
                                    temp=shm;
                                    for(i=0;i<JMLBRG;i++){
                                                if(temp->stok>0){
                                                            printf("%d %s\n",temp->stok,temp->nama);
                                                            cek=1;
                                                }
                                                temp+=jualsize;
                                    }
                                    if(cek==0) printf("Stok kosong\n");
                        }
                        else if(opt==2){
                                    printf("Masukkan nama : ");
                                    scanf("%s",nama);
                                    temp=shm;
                                    for(i=0;i<JMLBRG && strcmp(temp->nama,nama);i++){
                                                temp+=jualsize;
                                    }
                                    if(i==JMLBRG) printf("%s tidak tersedia\n",nama);
                                    else if(temp->stok==0) printf("Stok %s kosong\n",nama);
                                    else {
                                                printf("Masukkan jumlah : ");
                                                scanf("%d",&jumlah);
                                                if(temp->stok<jumlah) printf("Jumlah pembelian terlalu banyak. Stok %s %d, pembelian %d.",nama,temp->stok,jumlah);
                                                else{
                                                            (temp->stok)-=jumlah;
                                                            printf("Selamat, %d %s berhasil dibeli\n",jumlah,nama);
                                                }
                                    }
                        }
                        else if(opt==3){
                                    exit(1);
                        }
                        else printf("Masukan salah");
                        printf("\n");
            }
                       
            return 0;
}

3. Jalankan kedua program :

Selesai. Cukup sekian.SEMoga bermanfaat.Tetap SEMangat .Sampai jumpa di postingan menarik yang akan datang. Bye!! :)
Read more