Sabtu, 28 November 2015

FUSE


FUSE itu Rumit, Filesystem in Userspace (FUSE) merupakan mekanisme sistem operasi untuk sistem operasi Unix-like yang memungkinkan pengguna tidak ber-hak istimewa menciptakan file system 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.

Diagram Cara Kerja Fuse

Langkah - langkah instalasi FUSE :
  1. Download FUSE dari http://fuse.sourceforge.net/ pada bagian Download   stable release
  2. Extract file tar.gz dan masuk ke direktori FUSE. (tar –xvzf fuse-2.9.4.tar.gz)
  3. Lakukan installasi FUSE dengan cara :
  • Gunakan hak akses super user (sudo su)
  • Ketikkan perintah ./configure
  • Ketikkan perintah make
  • Ketikkan perintah make install
FUSE siap digunakan

Membuat FUSE :
Buka gedit, beri nama file berkesteni .c ketik kode berikut ini

#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include <sys/statfs.h>

static const char *dirpath = "/home/anandi/Documents/";
char alamat[1000];
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_getdir(const char *path, fuse_dirh_t h, fuse_dirfil_t filler)
{
    DIR *dp;
    struct dirent *de;
    int res = 0;
    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    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_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);
    strcpy(alamat,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_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;
}

static int xmp_chmod(const char *path, mode_t mode)
{
    int res;

    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    res = chmod(fpath, mode);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_write(const char *path, const char *buf, size_t size, off_t offset)                                                              
{
    int fd;
    int res;
    int res1;
    char fpath[1000],temp1[1000];

    sprintf(fpath, "%s%s", dirpath, path);
    fd = open(fpath, O_WRONLY);
 
    sprintf(temp1, "%s%s", dirpath, alamat);
    res1 = chmod(temp1, 0000);
    if(res1 == -1)
        res1 = -errno;

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

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

    close(fd);
    return res;
}

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

    close(res);
    return 0;
}

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,
    .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 menjalankannya:
  1. Ganti bagian static const char *dirpath = "/home/anandi/Documents" dengan static const char *dirpath = "/home/[nama user]/Documents"
  2. Simpan kemudian compile dengan menggunakan perintah: gcc -Wall [nama file].c `pkg-config fuse --cflags --libs` -o [nama sembarang file]
  3. Kemudian buat sebuah direktori, misalnya: /tmp/fuse
  4. Coba jalankan fuse tadi dengan cara: ./[nama file] /tmp/fuse
FUSE telah berjalan, maka semua isi direktori /home/anandi/Documents akan dimount ke direktori /tmp/fuse
Semoga bermanfaat dan Selamat mencoba....


Sabtu, 07 November 2015

Thread - Music Player


Di post kali ini akan membahas mengenai Thread di dalam sistem operasi. Thread itu bagian dari sebuah proses. Biasanya thread digunakan untuk menjalankan 2 aktivitas dalam waktu yang bersamaan.

Agar lebih jelasnya, ayo membuat program pemutar musik yang bisa dijalankan menggunakan terminal di linux dan berbasis konsol. Jadi nanti programnya ada fitur-fitur play, pause, stop seperti pemutar musik biasanya.

Nah, musik umum filenya kan ber-ekstensi .mp3 maka agar bisa diputar gunakan software "mpg123", jika belum ada silahkan install terlebih dahulu (bisa langsung online "sudo apt-get install mpg123"). Untuk lebih jelasnya lagi langsung ae yoo...

Musik Player mempunyai fitur-fitur :
  • Help      
  • List      
  • Play 
  • Pause        
  • Continue
  • Stop
Dalam program ini nantinya akan ada fungsi thread yang berisi berbagai macam thread (play, pause, dll), user bisa menginputkan perintah yang sesuai dengan thread yang sedang dijalankan.

Selanjutnya membuat fungsi threadnya

Thread 0. Membuat tampilan menu



Thread 1. Menampilkan lagu yang ada di folder playlist


Thread 2. Membuat thread play



Thread 3. Membuat thread pause











Thread 4. Membuat thread continue










Thread 5. Membuat thread stop











dan selanjutnya adalah membuat fungsi main nya (full code)

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

pthread_t tid[8];
char namalg[100];
char lg[100];
int n;

void* PlayAndCount(void *arg)
{
    unsigned long i=0;
    pthread_t id = pthread_self();
    int iter;
    if(pthread_equal(id,tid[0]))
    {
        //menampilkan menu
        system("clear");
        printf("1. Help\n");
        printf("2. List\n");
        printf("3. Play\n");
        printf("4. Pause\n");
        printf("5. Continue\n");
        printf("6. Stop\n");
    }
    else if(pthread_equal(id,tid[1]))
    {
        //menampilkan list lagu
        system("clear");
        chdir("/home/anandi/Desktop/modul3/playlist");
        system("ls|grep .mp3");
       
    }
    else if(pthread_equal(id,tid[2]))
    {
        //play
        system("pkill mpg123");       
        system("clear");
        snprintf(lg, sizeof(lg), "mpg123 %s", namalg);
        system(lg);
       
    }
    else if(pthread_equal(id,tid[3]))
    {
        //pause
        system("clear");
        sleep(n);
        system("pkill -STOP mpg123");
       
    }
    else if(pthread_equal(id,tid[4]))
    {
        //continue
        system("clear");
        sleep(n);
        system("pkill -CONT mpg123");
    }
    else if(pthread_equal(id,tid[5]))
    {
        //stop
        system("clear");
        sleep(n);
        system("pkill mpg123");
    }
    return NULL;
}

int main(void)
{
      while(1)
    {
        char kata[100];
        int err=0;
        scanf("%s", kata);
          
        if(err!=0) printf("\ncant create thread : [%s]", strerror(err));
        else if(strcmp(kata, "Help")==0) err=pthread_create(&(tid[0]), NULL, &PlayAndCount, NULL);
        else if(strcmp(kata, "List")==0) err=pthread_create(&(tid[1]), NULL, &PlayAndCount, NULL);
        else if(strcmp(kata, "Play")==0)
        {
            scanf("%s", namalg);
            err=pthread_create(&(tid[2]), NULL, &PlayAndCount, NULL);
        }
        else if(strcmp(kata, "Pause")==0)
        {
            scanf("%d", &n);
            err=pthread_create(&(tid[3]), NULL, &PlayAndCount, NULL);
        }
        else if(strcmp(kata, "Continue")==0)
        {
            scanf("%d", &n);
            err=pthread_create(&(tid[4]), NULL, &PlayAndCount, NULL);
        }
        else if(strcmp(kata, "Stop")==0)
        {
            scanf("%d", &n);
            err=pthread_create(&(tid[5]), NULL, &PlayAndCount, NULL);
        }
    }

    return 0;   
}
Jalankan di terminal, simpan file menggunakan .c jangan lupa di compile lihat apa yang terjadi.
Yak cukup sekian, cukup susah juga bagi saya wkwk, kurang sekurang kurangnya mohon maaf yang sebesar besarnya
Semoga Bermanfaat :)