Anda di halaman 1dari 19

LAPORAN RESMI

MODUL 02
SISTEM OPERASI 2013/2014

KELOMPOK B14 :
512100212 Otniel Yehezkiel
5113108703 Paskalina Arimua

JURUSAN TEKNIK INFORMATIKA


FAKULTAS TEKNOLOGI INFORMASI
INSTITUT TEKNOLOGI SEPULUH NOPEMBER
SURABAYA
2013

SOAL PENDAHULUAN MODUL II SISTEM OPERASI 2013


1. Cak Pur adalah pedagang pentol favorit yang biasa berdagang

disekitaran kampus ITS. Setiap hari, dagangannya laris dilahap oleh


ribuan mahasiswa. Pada suatu ketika, Surya yang selaku koordinator
konsumsi REEVA ingin memesan dagangannya cak Pur untuk
dijualkana ke ribuan pengunjung nantinya. Dikarenakan cak Pur ialah
orang yang lulusan SD sehingga mepunyai kelemahan dalam daya
ingatnya alias peupa. Sebagai salah satu pelanggan setianya, bantu
cak Pur dalam membuat suatu program reminder dengan spesifikasi
sebagai berikut:
a. Program yang dapat memberikan peringatan berupa audio pukul
04.00 agar terbangun untuk membeli dagangannya di Pasar
b. Membuat peringatan berupa tulisan untuk mengingatkan beliau
harus tiba di lokasi REEVA pukul 17:00.
2. Evan Dimas adalah pemain timnas U-19. PSSI menyatakan status Evan

Dimas sebagai pemain ilegal. Karena jengkel, Evan Dimas berniat


mengerjai server PSSI. Evan Dimas ingin membuat virus, dimana
setiap kelipatan menit ganjil, virus merubah semua nama file yang ada
di home directory PSSI menjadi PSSI_LAKNAT dan setiap kelipatan
menit genap, virus tersebut merubah semua nama file di home
directory PSSI menjadi PSSI_BERTAUBATLAH. Setiap kali virus itu
berjalan, virus itu akan mencatat aktivitas erubah name file yang ia
lakukan ke dalam sebuah file log yang hanya bisa dibaca oleh Evan
Dimas saja. Bantulah Evan Dimas membuat virus tersebut!
3. Rangga

dan Cinta ternyata takut dengan teguran dari Bahrul.


Keduanya berjanji untuk tidak bermain game lagi di jam aktif kuliah.
Dari situlah Cinta dan Rangga ingin membuat sebuah messenger
sendiri yang bisa dipakai untuk saling mengingatkan Keduanya ingin
Messanger ini memiliki status Vailable dan usy agar tidak mengganggu
ketika salah satunya sedang tidak mau diganggu. Ketika Rangga dalam
status Busy dan Cinta mengirimkan pesan, Rangga tidak akan
menerima pesan dar Cinta ini, selama statusnya masih Busy. Tapi
pesan ini akan langsung muncul ketika Rangga mengubah statusnya
menjadi Available. Bantulah mereka dalam menyelesaikan program
Messenger sesuai dengan keinginan mereka.

4. Diam diam rangga berencana membuat sebuah game sederhana

tentang kapal untuk mendekatkan diri dengan Bahrul. Rangga tahu


anda adalah orang yang ahli dalam pratikum Sistem Operasi dan
berpikir Logis. Ranggapun memberikan tantangan kepada anda untuk
memahami dan membuat game yang dimaksudnya sesuai dengan
gambaran dibawah ini:

JAWABAN
1. a. Code no1.c-nya:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <syslog.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
int main(){
pid_t pid=0, sid;
int hour,minute;
pid = fork();
if(pid < 0){
printf("fork failed!\n");
return 1;
}
if(pid > 0){
}
umask(0);
sid = setsid();
if(sid < 0){
return 1;
}
chdir("/home/otniel");
close(STDIN_FILENO);
close(STDOUT_FILENO);

close(STDERR_FILENO);
while(1)
{
time_t waktu;
struct tm *loctime;
time(&waktu);
loctime=localtime(&waktu);
hour=loctime->tm_hour;
minute=loctime->tm_min;
int second=loctime->tm_sec;
if(hour==4 && minute==0 && second==0)
{
popen("play /home/otniel/Dream_Theater_Metropolis.mp3","r");
sleep(1);
}
}
return 0;
}
b. Sama seperti code yang diatas, tinggal menambahkan fungsi IF saat jam
17.00 kedalam while(1) code.
if(hour==19 && minute==52 && second==0){
popen("bash /home/otniel/Shift2/x1/zenity.sh","r");
sleep(1);
}
Ketika pukul 17.00 maka dia akan membuat peringatan dengan zenity.sh
pada direktori diatas, berikut code zenity.sh-nya:
#!bin/bash
zenity --title "Warning" --info --text="Anda harus tiba dilokasi
REEVA sekarang!!"

Screenshoot:

Ketika daemon dijalankan:

2. Code no2.c-nya:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <time.h>
int main(){
char array[100][100];
char str[100],temp[100];
DIR *dp;
struct dirent *ep;
FILE *log;
pid_t pid=0,sid;
time_t waktu;
struct tm *loctime;
int i, j, k, a, b, menit;
//Buat Demon
pid = fork();
if(pid < 0){
printf("fork failed!\n");
return 1;
}
if(pid > 0){
return 0;
}
umask(0);
sid = setsid();
if(sid < 0){
return 1;
}

chdir("/home/otniel/PSSI");
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
//buat file log
log = fopen("/home/otniel/log","w+");
//ganti owner dan file permission
chown("/home/otniel/log",getuid(),getgid());
chmod("/home/otniel/log", 0660);
while(1){
//membuka direktori
dp = opendir ("/home/otniel/PSSI");
if(dp < 0){
printf("Tidak bisa membuka direktori!\n");
return 1;
}
//mengambil waktu (localtime) sekarang
time(&waktu);
loctime = localtime(&waktu);
menit = loctime->tm_min;
i = 0;
//mencatat nama2 file yang ada di dp ke dalam array
while (ep = readdir (dp)){
if(ep->d_type == DT_REG && ep->d_name[0]!='.'){
//copy nama file ke array
strcpy(array[i++],ep->d_name);
}
}

closedir(dp);
//Poses mengubah nama file dalam menit tertentu
for(j=0; j<i; j++){
if(menit % 2 == 1) sprintf(str,"PSSI_Laknat%d",j);
else sprintf(str,"PSSI_Bertaubatlah%d",j);
//renaming file
if(rename(array[j],str) < 0){
printf("Error rename file\n");
}
else{
fprintf(log,"time=(%d:%d) %s diubah menjadi
%s\n",loctime->tm_hour,loctime->tm_min,array[j],str);
fflush(log);
}
}
sleep(60);
}
return 0;
}
Screenshot Penggunaannya:

Log File dan Direktori PSSI

3. Code no 3 ada dua, secara keseluruhan codenya sama kecuali pada


bagian penomoran send.mtype dan receive.mtype untuk membuat 2 client
bisa melakukan chatting.
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define SIZE 256
typedef struct{
long mtype;
char mtext[SIZE];
}msg_s;

int main(){
int msqid;
int msgflg = IPC_CREAT | 0666;
bool busy = false;
pid_t pid;
key_t key;
msg_s send,receive;
send.mtype = 2;
receive.mtype = 1;
key = 1234;
if(msqid = msgget(key, msgflg) < 0){
printf("Tidak dapat membuat message queue\n");
}
pid = fork();
while(1){
if(pid > 0) //parent untuk pengirman
{
gets(send.mtext);
if(strcmp(send.mtext, "/busy") == 0){
if(!busy){
kill(pid,9); //child process
busy = true;
continue;
}
}
else if(strcmp(send.mtext, "/on") == 0){
if(busy){
pid = fork(); //bikin child process baru

busy = false;
continue;
}
}
msgsnd(msqid,

&send,

strlen(send.mtext)+1,

IPC_NOWAIT);
}
else //child -- utk nerima
{
msgrcv(msqid,

&receive,

SIZE,

receive.mtype,

MSG_NOERROR);
printf("%s\n",receive.mtext);
}
}
return 0;
}
Pada code satu lagi, hanya diganti pada .mtypenya saja dibalik:
send.mtype = 1;
receive.mtype = 2;

Screenshot Penggunaannya:
Buka 2 terminal, lalu jalankan masing2 codenya. Apabila user menulis /bussy
maka lawan chatnya tidak dapat mengirim chat ke pada user tersebut. Jika
user menulis /on maka chat kembali normal, dan menampilkan apa yang
ditulis lawan chatnya saat user tersebut /busy

4. Ada 2 code yang saya buat. Menggunakan metode pipeline, menyimpan


data/informasi kedalam suatu file untuk diproses. Code pertama adalah
sebagai server.c:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <linux/stat.h>
#include <unistd.h>
#include <string.h>
#define FIFO "DATAGAME"
#define FIFO_CHECK "SKOR"
int main()
{
FILE *file, *score;

char pemain1, pemain2, tmp,


int

cmd1[4], cmd2[4];

i,menang1,menang2,ulangi;

while(1)
{
menang1=0;
menang2=0;
ulangi=0;
umask(0);
mknod(FIFO, S_IFIFO|0666, 0);
mknod(FIFO_CHECK, S_IFIFO|0666, 0);

pemain1='\0';
pemain2='\0';
strcpy(cmd1,"");
strcpy(cmd2,"");
score=fopen(FIFO_CHECK,"w");
fprintf(score,"0");
fclose(score);

file=fopen(FIFO,"w");
fprintf(file,"");
fclose(file);

while(1)
{
file=fopen(FIFO,"r");
fscanf(file,"%c%c",&pemain1,&tmp);
if (pemain1>=65 && pemain1<=90) break;

fclose(file);
}

fgets(cmd1,5,file);
printf("%c%c%s\n",pemain1,tmp,cmd1);
fscanf(file,"%c",&pemain2);
fclose(file);
while(1)
{
file=fopen(FIFO,"r");
fscanf(file,"%c%c",&pemain2,&tmp);
if (pemain2!=pemain1)
{
break;
}
fclose(file);
}
fgets(cmd2,5,file);
printf("%c%c%s\n",pemain2,tmp,cmd2);
for (i=0;i<4;i++)
{
if (cmd1[i]=='S')
{
if (cmd2[i]=='P') {menang1=1;}
}
if (cmd2[i]=='S')
{
if (cmd1[i]=='P') {menang2=1;}
}
}

score=fopen(FIFO_CHECK,"w");
if
(menang1==menang2)
{fprintf(score,"2");
fprintf(score,"Permainan Berimbang\n"); ulangi=1;}
else if (menang1>menang2) {fprintf(score,"1");

fprintf(score,"Pemain %c menang\n",pemain1);}
else {fprintf(score,"1");
menang\n",pemain2);}

fprintf(score,"Pemain

%c

fclose(score);
fclose(file);
if (ulangi!=1) {printf("end\n"); break;}
printf("Ulangi!! :D\n");
}
return 0;
}
Jadi
server
yang
menentukan
siapa
pemenangnya
berdasarkan
data/informasi yang ada dalam file pipeline tersebut. Berikut adalah code
user yang akan menjalankan permainan.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *file, *score;
char pemain,tmp;
char pemain2[2],cmd[4], hasil[20];
int score_avail, replay;

while(1)
{
score_avail=0;
replay=0;

if ((file=fopen("DATAGAME","w"))==NULL)
{
printf("File tidak ada\n");
exit(1);
}
scanf("%c%c",&pemain,&tmp);
scanf("%c%c%c",&cmd[0],&cmd[1],&tmp);
scanf("%c%c%c",&cmd[2],&cmd[3],&tmp);
fprintf(file,"%c ",pemain);
fputs(cmd,file);
fprintf(file,"\n");
fclose(file);
while(1)
{
score=fopen("SKOR","r");
fscanf(score,"%d",&score_avail);
if (score_avail==1)
{
fgets(hasil,20,score);
printf("%s\n",hasil);
fclose(score);
break;
}
else if (score_avail==2) {
fgets(hasil,20,score);
printf("%s\n",hasil);
replay=1;
fclose(score);
break;
}

fclose(score);
}
if (replay!=1) break;
}
return 0;
}

Screenshoot penggunaan:
Buka 3 terminal, yang pertama jalankan server.c, 2 terminal lagi jalankan
permainan.c. Pada masing masing terminal permainan.c input nama dan
posisi kapal perangnya masing2.

Jika permainan berimbang: