Rabu, 02 Desember 2015

masalah fuse

Jihad dan Sekar adalah teman baik dan sangat dekat. Karena kedekatan itulah, timbul rasa

yang berbeda di hati Jihad untuk Sekar. Suatu hari, Jihad mengutarakan isi hatinya kepada

Sekar. Namun, Sekar ingin melihat dulu kesungguhan Jihad, Ia memberikan syarat bagi

Jihad untuk mendapatkan hatinya. Syarat tersebut adalah Sekar ingin Jihad

membuatkannya sebuah implementasi dari fuse yang baru saja didapatkannya dari asistensi

praktikum sistem operasi. Sebelumnya, ketika asistensi hanya diajarkan implementasi dasar

yaitu mengaitkan direktori lain (mount) dengan fuse. Padahal ketika dikaitkan dengan

direktori (mount) Sekar ingin agar implementasi fuse tersebut memiliki kriteria sebagai

berikut:
File dalam direktori tersebut hanya bisa di­copy atau dipindahkan sebanyak satu kali,

sehingga file yang telah di­copy atau dipindahkan tersebut tidak dapat di­copy atau

dipindahkan lagi (file terkunci). Contoh: terdapat file A. jika file A dicopy atau

dipindahkan maka akan terbentuk file salinan atau hasil pindahan file A, sedangkan

file A sendiri tidak bisa diapa­apakan lagi (terkunci). Namun file salinan A tetap bisa

dicopy atau dipindahkan, begitu seterusnya. (Kelas B​)

//cara mengerjakan soal adalah dengan open,read,write

static const char *dirpath = "/home/anindita/bisadong"; //ini yang mau di mount
char alamat[1000];//nyimpen alamat file yg dicopy

static int xmp_getattr(const char *path, struct stat *stbuf) //buat ambil atribut,kayak location dll
{
    int res;
    char fpath[1000]; //utk nyimpan gabungan dirpath dan fpath
    sprintf(fpath,"%s%s",dirpath,path);//buat gabungin, lalu disimpan di fpath
    res = lstat(fpath, stbuf);//fungsinya
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_readlink(const char *path, char *buf, size_t size) //untuk membaca link
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);

    res = readlink(fpath, buf, size - 1);
    if(res == -1)
        return -errno;

    buf[res] = '\0';
    return 0;
}


static int xmp_getdir(const char *path, fuse_dirh_t h, fuse_dirfil_t filler) //untuk ambil direktori
{
    DIR *dp;
    struct dirent *de;
    int res = 0;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path); //gabungin path dan dirpath ke fpath
   
    if(strcmp(path,"/") == 0) //ambil file lokasinya yg dipisah pakai tanda "/"
    {
        path=dirpath;
        sprintf(fpath,"%s",path); //masukin path ke fpath
    }
    else sprintf(fpath, "%s%s",dirpath,path);

   
    dp = opendir(fpath);//buka direktorinya
    if(dp==NULL)
    {
        return -errno;
    }
    while((de = readdir(dp))!=NULL)//membaca isi dari direktori
    {
        res = filler(h, de->d_name, de->d_type);
        if(res!=0) break;
    }
    //system("notify-send hello");
    closedir(dp);
    return res;
}

static int xmp_mknod(const char *path, mode_t mode, dev_t rdev)//mknod adalah fungsi untuk membuat node file (yg belum ada isinya)
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path); //gabungin path dan dirpath ke fpath
    res = mknod(fpath, mode, rdev);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_mkdir(const char *path, mode_t mode) //untuk membuat direktori baru
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);//gabungin path dan dirpath ke fpath
    res = mkdir(path, mode);//untuk membuat direktori baru
    if(res == -1)
        return -errno;

    return 0;
}

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

    return 0;
}

static int xmp_rmdir(const char *path)//remove direktori
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);//gabungin path dan dirpath ke fpath
    res = rmdir(fpath);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_symlink(const char *from, const char *to)//creates a symbolic link.
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",from,to);
    res = symlink(from, to);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_rename(const char *from, const char *to)//untuk mengubah nama file
{
    int res;
    char fpath[1000];
    //sprintf(fpath,"%s%s",from,to);//
    res = rename(from, to);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_link(const char *from, const char *to)//membuat hard link ke file
{
    int res;
    char fpath[1000];
    //sprintf(fpath,"%s%s",from,to);
    res = link(from, to);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_chmod(const char *path, mode_t mode)//memberi/mengubah akses/permission menjadi seperti yang diinginkan
{
    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_chown(const char *path, uid_t uid, gid_t gid)//mengganti owner dari file
{
    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_utime(const char *path, struct utimbuf *buf)//untuk memberikan akses, merubah berapa kali dia bisa diakses dan di modif
{
    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_open(const char *path, int flags)//untuk membuka file
{
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);////gabungin path dan dirpath ke fpath
    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)//untuk membaca file
{
    int fd;
    int res;
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);//gabungin path dan dirpath ke fpath
    strcpy(alamat,fpath);   //menyimpan alamat file yg dicopy
    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,//untuk mengedit isi file
                     off_t offset)
{
    int fd;
    int res;
    char fpath[1000];
   
    sprintf(fpath,"%s%s",dirpath,path);////gabungin path dan dirpath ke fpath
    fd = open(path, O_WRONLY);
    if(fd == -1)
        return -errno;
    chmod (alamat,0000);//0000 agar sudah tidak bisa diakses lagi
    res = pwrite(fd, buf, size, offset);
    if(res == -1)
        res = -errno;
   
    close(fd);
    return res;
}
/*
static int xmp_statfs(struct fuse_statfs *fst)
{
    struct statfs st;
    int rv = statfs("/",&st);
    if(!rv) {
        fst->block_size  = st.f_bsize;
        fst->blocks      = st.f_blocks;
        fst->blocks_free = st.f_bavail;
        fst->files       = st.f_files;
        fst->files_free  = st.f_ffree;
        fst->namelen     = st.f_namelen;
    }
    return rv;
}
*/
static int xmp_release(const char *path, int flags)
{
    /* Just a stub.  This method is optional and can safely be left
       unimplemented */
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    (void) path;
    (void) flags;
    return 0;
}

static int xmp_fsync(const char *path, int isdatasync)
{
    /* Just a stub.  This method is optional and can safely be left
       unimplemented */
    char fpath[1000];
    sprintf(fpath,"%s%s",dirpath,path);
    (void) path;
    (void) isdatasync;
    return 0;
}

static struct fuse_operations xmp_oper = {
    //char fpath[1000];
    //sprintf(fpath,"%s%s",dirpath,path);
    .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,
    //.utime    = xmp_utime,
    .open    = xmp_open,
    .read    = xmp_read,
    .write    = xmp_write,
    //.statfs    = xmp_statfs,
    //.release    = xmp_release,
    //.fsync    = xmp_fsync
   
};

int main(int argc, char *argv[])
{
    //char fpath[1000];
    //sprintf(fpath,"%s%s",dirpath,path);
    fuse_main(argc, argv, &xmp_oper);
    return 0;
}

Sabtu, 07 November 2015

IPC dan thread

IPC  = cara atau mekanisme pertukaran data antara
satu proses dengan proses lainnya, baik itu proses yang berada di dalam komputer yang
sama, atau komputer jarak jauh yang terhubung melalui jaringan.ada 4 macam, yaitu pipes, message queue, shared memory dan socket.

thread atau proses ringan(lightweight) adalah bagian terkecil dari suatu proses. proses ini bisa dijadwalkan oleh suatu sistem operasi. thread ada dua macam , yaitu single threading dan multithreading. Single Threading
Adalah sebuah proses yang hanya memiliki satu thread yang berjalan.
Biasanya fungsi thread ini digunakan sebagai pengendali jalannya proses. sedangkan multi threading
Adalah proses yang memiliki lebih dari satu thread yang berjalan didalamnya,
sehingga dalam hal ini proses dapat menjalankan lebih dari satu tugas dalam satu
waktu.

conso

OINK Computer
Oink adalah seorang distributor komponen komputer untuk area Surabaya. Komponen yang tersedia di
Oink Komputer yaitu RAM, harddisk, motherboard, PSU, VGA, dan processor. Setiap harinya dia
melakukan banyak transaksi dengan beberapa pelanggannya. Setiap saat oink dapat menambahkan stok
 :barangnya dan setiap pelanggan dapat membeli barang di oink comp. Oink merasa kesulitan dalam
mencatat semua transaksinya dalam buku, jadi bantulah oink membuat sebuah aplikasi yang dapat
memudahkan pekerjaannya. Terdapat 2 aplikasi, untuk penjual dan pembeli.
Berikut adalah kebutuhan dari aplikasi untuk penjual:
1. Terdapat fitur menu untuk menampilkan daftar menu: lihat stok, tambah stok
2. Fitur tambah stok memiliki format inputan: nama_barang jumlah_barang. Jika barang yang sudah
ada di stok diinputkan kembali, maka stoknya bertambah.
3. FItur lihat stok menampilkan stok semua barang yang tersisa dengan format output: nama_barang
jumlah_barang
Berikut adalah kebutuhan dari aplikasi untuk pembeli:
1. Terdapat fitur menu untuk menampilkan daftar menu: lihat stok, beli barang
2. Fitur beli barang memiliki format inputan: nama_barang jumlah_barang. Jika fitur ini dijalankan
maka stok barang akan berkurang sesuai jumlah yang dibeli. Jika jumlah pembelian lebih dari stok
yang tersedia, maka program menampilkan pesan kesalahan.
3. FItur lihat stok menampilkan stok semua barang yang tersisa dengan format output: nama_barang
jumlah_barang

langkahnya :

kali ini kita akan membuat 2 program, yg satu akan digunakaan oleh penjual, dan yang lainnya akan digunakan oleh pembeli. kita akan menyelesaikan soal ini dengan menggunakan IPC yaitu shared memory. di dalam program, kita akan membuat struct stok yg ada, lalu menggunakan perintah2 yg cocok agar nantinya program bisa melakukan penambahan dan menampilkan stok barang yg kita miliki

//program ini akan dijalankan oleh penjual

struct STOK //kita akan membuat struct yang berisi stok barang
{
    int RAM;
    int harddisk;
    int motherboard;
    int PSU;
    int VGA;
    int processor;
};


int  main()
{//shared mem perlu identitas,salah satunya pake key
    key_t KEY; //buat bedain shared memory
    int ID;

    struct STOK *data;
    char nama_barang[50];
    int pilihan;   
    int tambah;
    KEY = 1111; // key bisa diisi apa saja, namun harus sama dgn program yg dibuat oleh pembeli
    ID = shmget(KEY, sizeof(struct STOK)/*jumlah bit pada memori untuk menyimpan array*/, IPC_CREAT /*koneksi antar proses? kasi permission buat read&write*/ | 0666); //biar memory bs di share, dipake di bbrp program

    data = (struct STOK *) shmat(ID, NULL, 0); //buat ambil address dr mem yg dishare
   
    //semuanya dimulai dari 0 ya
    data->RAM = 0;
    data->harddisk = 0;
    data->motherboard = 0;
    data->PSU = 0;
    data->VGA = 0;
    data->processor = 0;
   
    while(1)
    {   
        printf("\n\n1 = Lihat Stok Barang\n");
        printf("2 = Tambah Barang\n\n");       
           
        scanf("%d", &pilihan);

        if (pilihan == 1) //kalo diinput angka 1, stok barang akan muncul
        {
            system("clear"); //supaya layarnya bersih dulu
            printf("STOK RAM         = %d \n",data->RAM);
            printf("STOK harddisk    = %d \n",data->harddisk);
            printf("STOK motherboard = %d \n",data->motherboard);
            printf("STOK PSU         = %d \n",data->PSU);
            printf("STOK VGA         = %d \n",data->VGA);
            printf("STOK processor   = %d \n",data->processor);
        }       

        else if(pilihan == 2) //jika diinput 2, user bisa menambah barang yg diinginkan
        {
            system("clear"); //biar layarnya kosong dulu
            printf("Barang yang Dijual: \n");
            printf("RAM \nharddisk \nmotherboard \nPSU \nVGA \nprocessor\n");
            printf("\n\nKetikkan nama barang yang ingin ditambah\n");
            scanf("%s", nama_barang);
           
//untuk mengetahui barang yg ingin ditambah, kita menggunakan strcmp
            if (strcmp(nama_barang,"RAM")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&tambah);
                if( tambah > -1){ //supaya nambahnya kalo user masukin angka 0 atau lebih
                    data->RAM += tambah;
                    printf("STOK RAM = %d \n", data->RAM);
                }
                else{printf("tidak bisa");}
            }

            else if (strcmp(nama_barang,"harddisk")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&tambah);
                if( tambah > -1){
                data->harddisk += tambah;
                printf("STOK harddisk = %d \n", data->harddisk);
                }
                else{printf("tidak bisa");}
            }

            else if (strcmp(nama_barang,"motherboard")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&tambah);
                if( tambah > -1){
                data->motherboard += tambah;
                printf("STOK motherboard = %d \n", data->motherboard);
                }
                else{printf("tidak bisa");}}

            else if (strcmp(nama_barang,"PSU")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&tambah);
                if( tambah > -1){
                data->PSU += tambah;
                printf("STOK PSU = %d \n", data->PSU);}
                else{printf("tidak bisa");}
            }

            else if (strcmp(nama_barang,"VGA")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&tambah);if( tambah > -1){
                data->VGA += tambah;
                printf("STOK VGA = %d \n", data->VGA);}
                else{printf("tidak bisa");}
            }

            else if (strcmp(nama_barang,"processor")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&tambah);if( tambah > -1){
                data->processor += tambah;
                printf("STOK processor = %d \n", data->processor);}
                else{printf("tidak bisa");}
            }
            else printf("Barang Tidak Ada\n");
        }
        else getchar();
    }
   
}


//program ini akan dijalankan oleh pembeli

struct STOK
{
    int RAM;
    int harddisk;
    int motherboard;
    int PSU;
    int VGA;
    int processor;
};

int  main(void)
{
    key_t KEY;
    int ID;
    struct STOK *data;
    char nama_barang[15];
    int pilih;
    int beli;

    KEY = 1111;
    ID = shmget(KEY, sizeof(struct STOK), 0666);


    data = (struct STOK *) shmat(ID, NULL, 0);

    while(1)
    {   
        printf("\n\n1 = Lihat Stok Barang\n");
        printf("2 = Beli Barang\n\n");
        scanf("%d",&pilih);

        if(pilih == 1)
        {       
            system("clear");   
            printf("Jumlah RAM = %d \n",data->RAM);
            printf("Jumlah harddisk = %d \n",data->harddisk);
            printf("Jumlah motherboard = %d \n",data->motherboard);
            printf("Jumlah PSU = %d \n",data->PSU);
            printf("Jumlah VGA = %d \n",data->VGA);
            printf("Jumlah processor = %d \n",data->processor);
        }

        else if(pilih == 2)
        {
            system("clear");
            printf("Barang yang Dijual: \n");
            printf("RAM \nharddisk \nmotherboard \nPSU \nVGA \nprocessor\n");
            printf("\n\nKetikkan nama barang yang ingin ditambah\n");
            scanf("%s", nama_barang);

            if (strcmp(nama_barang,"RAM")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&beli);

                if (beli > data->RAM)
                {
                    printf("Jumlah yang dibeli melebihi stok\n");
                }

                else
                {
                    printf("Anda membeli %d RAM\n",beli);
                    data->RAM -= beli;
                }
            }

            else if (strcmp(nama_barang,"harddisk")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&beli);

                if (beli > data->harddisk)
                {
                    printf("Anda membeli terlalu banyak\n");
                }

                else
                {
                    printf("Anda membeli %d harddisk\n",beli);
                    data->harddisk -= beli;
                }
            }

            else if (strcmp(nama_barang,"motherboard")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&beli);

                if (beli > data->motherboard)
                {
                    printf("Anda membeli terlalu banyak\n");
                }

                else
                {
                    printf("Anda membeli %d motherboard\n",beli);
                    data->motherboard -= beli;
                }
            }

            else if (strcmp(nama_barang,"PSU")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&beli);

                if (beli > data->PSU)
                {
                    printf("Anda membeli terlalu banyak\n");
                }

                else
                {
                    printf("Anda membeli %d PSU\n",beli);
                    data->PSU -= beli;
                }
            }

            else if (strcmp(nama_barang,"VGA")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&beli);
                if (beli > data->VGA)
                {
                    printf("Anda membeli terlalu banyak\n");
                }

                else
                {
                    printf("Anda membeli %d VGA\n",beli);
                    data->VGA -= beli;
                }
            }

            else if (strcmp(nama_barang,"processor")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&beli);

                if (beli > data->processor)
                {
                    printf("Anda membeli terlalu banyak\n");
                }

                else
                {
                    printf("Anda membeli %d processor\n",beli);
                    data->processor -= beli;
                }
            }
            else printf("Barang Tidak Ada\n");
        }
        else getchar();
    }
}


Minggu, 18 Oktober 2015

tentang daemon

apa itu daemon?
                daemon adalah suatu proses yang dibuat untuk bekerja secara otomatis karena tidak memiliki terminal pengontrol dan melakukan pekerjaannya dibalik layar atau yang biasa disebut sebagai background process. daemon tidak berhubungan langsung dengan user (user interface).

bagaimana proses pembuatan daemon?
           fork parent process dan penghentian parent process
langkah awal untuk membuat daemon adalah dengan melakukan forking. apa fungsinya? agar process baru dibuat dan parent process nya mati. setelah proses induk mati sistem akan mengira bahwa proses telah selesai. sehingga kembali ke terminal user. dan yang melanjutkan program adalah child processnya. setelah itu, kita harus mengubah mode file menggunakan UMASK(0)
daemon akan menulis beberapa file termasuk logs. maka mode file tersebut harus disesuaika agar dapat ditulis dan dibaca dengan benar. caranya gimana? dengan umask (). selanjutnya buat Unique Session ID (SID). apa gunanya membuat SID? SID dibuat dari kernel agar dapat beroperasi. caranya adalah dengan menggunakan setsid(). nantinya, setsid() akan memiliki return tipe sama seperti fork(). lalu kita harus memastikan bahwa directori kerja yang aktif ada di tempat yang selalu ada. pakai fungsi chdir(). pembuatan daemon hampir selesai. selanjutnya kita harus menutup File Descriptor Standar. fungsi close()  digunakan untuk menutup file deskriptor standar. kita perlu melakukannya agar file deskriptor tidak berulang dan mengurangi potensi bahaya dalam hal keamanan. file deskriptor standar itu sendiri meliputi (STDIN,STDOUT,STDERR). inti dari kerja daemon adalah dengan membuat loop utama. hal ini dilakukan agar daemon bekerja dalam waktu yang ditentukan.



























































berikut adalah contoh soal dari modul 2 yang menggunakan daemon :


Uul adalah seorang programer handal dan berani. Suatu hari, dia ingin membuat sebuah virus bernama “Virus Quotes 2 Menit”, dimana virus tersebut terdiri dari file aplikasi virus dan daftar quotes dalam sebuah file bernama virus.txt. Jika virus ini ada dalam komputer anda, maka akan muncul pop-up dari semua isi file virus.txt yang terpisah dengan tanda delimiter koma (,) satu persatu setiap 2 menit sekali. Sebagai praktikan sisop yang pintar, bantulah Uul untuk membuat virus tersebut!
Penyelesaian : kita harus membuat virus dimana virus tersebut akan mengeluarkan pop up dari daftar yang ada di dalam virus.txt yang terpisah dengan tanda delimeter koma satu persatu setiap 2menit sekali.
langkah :
1.       Membuat virus.txt yang berisikan quotes yg akan di-pop-up, pisahkan dengan koma(,).
2.       Membuka virus.txt dan mengambil kata lalu dimasukkan ke variabel yg diinginkan (pop)
3.       Menggunakan strtok untuk memotong dengan koma
4.       Menggunakan zenity ( perintah agar bisa pop up)


Uul adalah seorang programer handal dan berani. Suatu hari, dia ingin membuat sebuah virus bernama “Virus Quotes 2 Menit”, dimana virus tersebut terdiri dari file aplikasi virus dan daftar quotes dalam sebuah file bernama virus.txt. Jika virus ini ada dalam komputer anda, maka akan muncul pop-up dari semua isi file virus.txt yang terpisah dengan tanda delimiter koma (,) satu persatu setiap 2 menit sekali. Sebagai praktikan sisop yang pintar, bantulah Uul untuk membuat virus tersebut!
Penyelesaian : kita harus membuat virus dimana virus tersebut akan mengeluarkan pop up dari daftar yang ada di dalam virus.txt yang terpisah dengan tanda delimeter koma satu persatu setiap 2menit sekali.
langkah :
1.       Membuat virus.txt yang berisikan quotes yg akan di-pop-up, pisahkan dengan koma(,).
2.       Membuka virus.txt dan mengambil kata lalu dimasukkan ke variabel yg diinginkan (pop)
3.       Menggunakan strtok untuk memotong dengan koma
4.       Menggunakan zenity ( perintah agar bisa pop up)


int main()
{
                FILE *pFile;
                char abc [100], pop[100];
                char *pch;
                //daemon
                pid_t pid, sid;
                pid = fork();
               
                if (pid<0) {
                                exit(EXIT_FAILURE);
                }
                if (pid>0) {
                                exit(EXIT_SUCCESS);
                }
                umask (0);
                sid = setsid ();
                if (sid<0){
                                exit(EXIT_FAILURE);
                }
                //membuka fie virus.txt
                pFile = fopen("virus.txt","r");
                fgets(pop,100,pFile) ;//ambil kata dr virus.txt
   if (pFile == NULL) perror ("Error opening file"); //kalo virus.txt kosong jadi error
while (1)
{
                strcpy(abc,pop);//copy dr pop ke abc
                pch = strtok(abc,",");//dipotong pake koma
                while (1)
                {
                                char temp[]="zenity --warning --text='";//ini perintah pop up
                                strcat(temp,pch); //gabungin zenity &kata
                               
                                strcat(temp,"'");//gabungin lagi koma atas
                                system(temp);
                                pch = strtok(NULL,","); //dikasih null biar lanjut ga diulang2
                                sleep(120); //quotes keluar setiap 120 detik sekali
                }
}
exit(EXIT_SUCCESS);
fclose(pFile);
}


Sabtu, 26 September 2015

tutorial 1



masalah Modul 1
Praktikum Sistem Operasi 2015

1.       Cayza diberi tugas oleh dosennya untuk merubah codingan program bilangan prima dari bahasa C ke bash script.
Input: baris pertama berisi bilangan n
Output: semua bilangan prima <= n
Contoh:
5
2 3 5

10
2 3 5 7
Bantulah cayza untuk menyelesaikan tugasnya ini!

Penyelesaian :
Kita harus memberi output semua bilangan prima <= n
Dengan cara membagi bilangan dengan bilangan sebelumnya hingga n

2.       Selain kuliah, Cayza juga merupakan seorang dokter praktik, dia memiliki 5 pasien yang harus rutin meminum obat. Sebagai dokter yg baik, Cayza ingin terus memantau sudah berapa jumlah obat yang sudah diminum oleh setiap pasien. Cayza harus mengunduh berkas "laporan minum obat pasien" yang berada di kantornya melalui alamat http://10.151.36.201/sisop/jadwal.txt. Setiap berkas yang diunduh otomatis diletakkan pada sebuah direktori yang namanya sesuai dengan tanggal bulan dan tahun saat ini dengan format dd_mm_yyyy (contoh: 11_12_2013). Berkasnya juga otomatis di-rename sesuai dengan jam, menit, dan detik ketika berkas tersebut diunduh dengan format HH_MM_SS (contoh: 17_18_19). Buatlah script untuk membantu Cayza dalam melakukan hal ini agar pekerjaannya berjalan lebih mudah hanya dalam sekali proses.

Penyelesaian :
-          Mendownload file dan memberi nama otomatis di-rename sesuai dengan jam, menit, dan detik ketika berkas tersebut diunduh dengan format HH_MM_SS (contoh: 17_18_19)
-          Setelah diunduh, file tersebut masuk ke direktori  dengan nama sesuai dengan tanggal bulan dan tahun saat ini dengan format dd_mm_yyyy (contoh: 11_12_2013).


3.       Dalam berkas tersebut terdapat lima waktu pasien mendatangi Cayza untuk check up. Setiap harinya, semua pasien diperbolehkan minum obat mulai jam 6 pagi hingga jam 12 malam dengan selang waktu 3 jam sekali. Cayza harus mengetahui jumlah obat yang telah diminum oleh setiap pasien hingga waktu pasien check up pada hari itu. Oleh karena itu dia harus menambahkan keterangan jumlah obat yang sudah diminum setiap pasien hingga  waktu check up pada berkas yang sudah diunduh sebelumnya. Buatlah script untuk membantu cayza dalam melakukan hal ini.
Contoh file setelah script dijalankan:
08:00:01 - Pasien A Sudah Minum 1 obat
10:30:34 - Pasien B Sudah Minum 2 obat
11:32:46 - Pasien C Sudah Minum 2 obat
15:30:10 - Pasien D Sudah Minum 4 obat
17:22:30 - Pasien E Sudah Minum 4 obat

Penyelesaian :
Kita harus menghitung obat yang sudah diminum oleh pasien. Obat dihitung mulai dari jam 6pagi hingga 12 malam. Berarti kita perhatikan jam yang mulai dari jam 6, lalu dibagi 3 dan dikurangi 1. Contoh jam 9
9:3= 3
3-1=2
Jawaban benar

4.       Setelah itu Cayza harus mengarsipkan folder berisi berkas yang sudah disunting dalam bentuk kompresi tar.gz. dengan format XZZ (X = kelas, ZZ = Nomor Kelompok), contoh: A01.tar.gz. Setiap kali terjadi pengarsipan, akan otomatis dicatat ke dalam log file dengan format nama file log_XZZ.txt (X = kelas, ZZ = Nomor Kelompok), contoh: log_A01.txt.

Penyelesaian :

Kita hanya diminta untuk mengarsipkan folder berisi berkas yang sudah disunting dalam bentuk tar.gz dan dengan format nama yang sudah ditentukan. Lalu setiap kali tejadi pengarsipan akan otomatis dicatat ke dalam log file dengan nama format file log_kelas kelompok.
Nah disini saya print berkas sudah di zip untuk menandakan bahwa berkas sudah di zip.