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 dicopy atau dipindahkan sebanyak satu kali,
sehingga file yang telah dicopy atau dipindahkan tersebut tidak dapat dicopy 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 diapaapakan 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;
}
Rabu, 02 Desember 2015
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 ComputerOink 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();
}
}
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
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.
Langganan:
Postingan (Atom)