Professional Documents
Culture Documents
MODUL 02
SISTEM OPERASI 2013/2014
KELOMPOK B14 :
512100212 Otniel Yehezkiel
5113108703 Paskalina Arimua
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:
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:
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
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.