Professional Documents
Culture Documents
MODUL 2
SYSTEM CALL DAN
INTERPROCESS COMUNICATION (IPC)
Oleh:
Kelompok 5
Adhitya Bhawiyuga 5107.100.084
Rizky Septiandy W 5107.100.103
Asisten:
Meyimpan parameter dalam blok atau tabel pada memory, dan alamat tabel
di-passing sebagai parameter dlm register
Jenis statusnya :
- Status New yaitu status dimana proses sedang dibuat.
- Status Ready yaitu status dimana proses siap dieksekusi tetapi CPU belum tersedia karena
sedang
mengerjakan proses lain.
- Status Waiting yaitu status dimana proses sedang menunggu suatu kejadian tertentu.
Misalnya sedang
menunggu operasi I/O selesai, menunggu signal dari proses lain, tersedianya memori, dsb.
- Status Running yaitu status dimana proses dieksekusi. Pada status ini CPU sedang
mengeksekusi
instruksi – instruksi pada proses.
- Status Terminated yaitu status dimana proses diakhiri.
Atribut:
-PID(Process ID)
-tty
4. Proses satu dengan proses lain dibedakan berdasarkan PID atau Process
Identification berupa angka integer positif yang unik.
- Return value :
Jika sukses, fork() akan mengembalikan nilai 0 pada proses anak dan mengembalikan
proses Iddari proses anak ke proses induk. Jika terjadi error, maka akan mengembalikan
nilai -1.
b. getpid() / getppid()
- Kegunaan :
Untuk mendapatkan suatu process ID
- Parameter :
void
- Syntax :
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
- Return value :
Fungsi getpid() akan mengembalikan process ID dari proses yang memanggil. Funsi ini
selalu dikembalikan dengan sukses.
c. exit()
- Kegunaan :
Untuk menutup suatu proses
- Parameter :
int status
- Syntax :
#include <stdlib.h>
void exit(int status);
- Return value :
Fungsi exit() tidak memiliki return value.
d. wait()
- Kegunaan :
Menunggu pros to stop or terminate
- Parameter :
Pointer int *stat_loc yang akan menjadi tempat simpanan
- Syntax :
#include <sys/wait.h>
pid_t wait(int *stat_loc);
- Return value :
process ID dari child process pada status yang dilaporkan
e. execv()
- Kegunaan :
berguna untuk membentuk proses baru.Tapi child process mempunyai intruksi yang
berbeda dengan parent process sehingga kedua proses ini tidak lagi identik.
- Parameter :
- path : Nama dan path dari proses baru
- argv : Daftar argumen untuk proses yang baru. Berisi pointer dari sebuah array karakter.
- Syntax :
int execv(const char *path, char *const argv[]);
- Return value :
Jika sukses, fungsi ini tidak mengembalikan nilai, namun jika gagal akan mengembalikan
nilai -1.
2. named pipe
Named pipes (FIFOs), yang muncul sebagai masukan direktori aktual, dapat di-
share oleh proses-proses yang tidak berhubungan. Named pipes mirip dengan
unnamed pipes tapi memiliki keuntungan tambahan. Saat dibuat, named pipes
memiliki sebuah “directory entry”. Dengan directory entry maka akan ada file
access permissions dan kemampuan unrelated processes untuk menggunakan pipe
file. Meskipun FIFO memiliki sebuah directory entry, perlu diingat bahwa data
yang ditulis ke FIFO dilewatkan ke dan disimpan oleh kernel dan tidak secara
langsung ditulis ke file system.
Named pipes dapat dibuat pada shell level (dengan command line) atau dengan
sebuah program. Pada shell level, command yang digunakan untuk membuat
named pipe adalah mknod. Syntax untuk mknod command untuk membuat named
pipe adalah :
linux$ mknod PIPE p
Argumen pertama pada mknod command adalah file name untuk FIFO. Argumen
kedua adalah sebuah lowercase p, yang memberi peringatan mknod bahwa sebuah
FIFO file akan dibuat.
3. message queue
Designer UNIX menemukan bahwa jenis interprocess communications yang
diimplementasikan menggunakan signals dan pipes bersifat terbatas. Untuk
menambah flexibilitasdan ukuran interprocess communication, fasilitas
komunikasi tambahan pun dibuat. Fasilitas itu adalah message queue, semaphore
dan shared memory.
Sekali dibuat, sebuah message queue akan dijaga oleh system. Unrelated
processes, yang mengeksekusi pada waktu yang berbeda, dapat menggunakan
message queue untuk melewatkan informasi. Tiap message memiliki associated
type yang dapat digunakan untuk mengimplementasikan sebuah rudimentary form
of data multiplexing saat multiple producers dilibatkan. Message queues dibuat
dan diakses menggunakan system call msgget. Messages ditempatkan pada
message queue dengan system call msgsnd dan mengambil dari queue dengan
system call msgrcv. Manipulasi message queue dapat menggunakan msgctl.
msgctl system call mengembailkan informasi tentang message queue, ijin
modifikasi tergantung access permissions, dan mengizinkan pemilik untuk
menghapus fasilitas message queue.
4. shared memory
Shared memory memberikan user komunikasi yang efektif melalui sharing data
yang berada dalam memory. Tidak seperti komunikasi yang berbasis pipe, Data
ini dapat diakses pada nonserial (random) manner. Untuk mencegah
ketidakkonsistensian, semaphores sering digunakan untuk mengkoordinasi access
pada segmen shared memory. Shared memory segments dihasilkan dengan
shmget system call. Jika sebuah shared memory segment telah dibuat, shmget call
menghasilkan proses dengan access ke segment. System call shmctl digunakan
untuk mendapatkan status sebuah memory segment, mengatur permissions, dan
menghapus sebuah shared memory segment. System call mmap digunakan untuk
memetakan virtual memory space dari sebuah process ke file. Saat file tetap ada
saat sebuah proses dihentikan, mmaped files mengizinkan komunikasi informasi
antar proses yang berada pada waktu yang berbeda.
Tiap signal diberi nomer dan didefinisikan pada header file <signal.h>. Pada
Linux definisi signal juga berada pada <bits/signum.h>. File ini akan diikutkan
otomatis saat kita memanggil <signal.h>. Proses yang menerima signal dapat
melakukan salah satu dari 3 hal berikut :
1. Melakukan salah satu proses system default khusus untuk signal. Untuk
kebanyakan signal, aksi defaultnya adalah (a) memberitahukan proses induk
yang di-terminasi (b) Menghasilkan sebuah core file (sebua dile yang berisi
memory image dari proses), dan (c) terminate.
2. Tidak menghiraukan signal. Sebuah proses dapat melakukan hal ini dengan
semua signal kecuali 2 signal khusus: SIGSTOP (signal 23), Sebuah stop-
processing signal yang tidak dihasilkan dari terminal, dan SIGKILL (signal
9), yang mengindikasikan sebuah proses akan di-kill (terminated).
3. Menangkap signal. Seperti pada ignoring signal, hal ini dapat dilakukan
untuk semua signal kecuali SIGSTOP dan SIGKILL. Saat sebuah proses
menangkap dignal, proses akan membangkitkan fungsi khusus untuk
merespon signal.
Signal dapat diberikan dengan perintah kill. Perintah untuk melihat signal
dalam system adalah :
kill –l
Perintah untuk mengirim signal:
kill -<SIGNAL> <PID>
char array[100];
void
read_from_pipe (int file)
{
FILE *stream;
int c;
int i=0;
stream = fdopen (file, "r");
while ((c = fgetc (stream)) != EOF){
array[i]=c;
i++;
}
fclose (stream);
}
void
write_to_pipe (int file,char arr[],int length)
{
FILE *stream;
stream = fdopen (file, "w");
int i=0;
for(i=0;i<length;i++){
fprintf (stream, "%c",arr[i]);
}
fclose (stream);
}
int
main (void)
{
pid_t pid;
int mypipe[2];
int mypipe2[2];
int i=0;
char array_input[100];
/* Create the pipe. */
printf("Masukkan stringnya : ");
gets(array_input);
int length=strlen(array_input);
if (pipe (mypipe))
{
fprintf (stderr, "Pipe failed.\n");
return EXIT_FAILURE;
}
pipe(mypipe2);
pid = fork ();
if (pid == (pid_t) 0)
{
/* This is the child process.
Close other end first. */
//baca dulu dari pipe
close (mypipe[1]);
read_from_pipe (mypipe[0]);
printf("Sebelum : \n");
i=0;
for(i=0;i<strlen(array_input);i++) printf("%c",array_input[i]);
printf("\n");
close (mypipe[0]);
char temp[15];
int j = length-1;
i=0;
for(i=0;i<length;i++){
temp[i]=array[j];
j--;
}
i=0;
for(i=0;i<length;i++){
array[i]=temp[i];
}
close (mypipe2[0]);
write_to_pipe (mypipe2[1],array,strlen(array));
close(mypipe2[1]);
return EXIT_SUCCESS;
}
else if (pid < (pid_t) 0)
{
/* The fork failed. */
fprintf (stderr, "Fork failed.\n");
return EXIT_FAILURE;
}
else
{
/* This is the parent process.
Close other end first. */
//tulis ke pipe ke proses anak
close (mypipe[0]);
write_to_pipe (mypipe[1],array_input,strlen(array_input));
close (mypipe[1]);
//baca dari pipe hasil olahan proses anak
printf("Sesudah : \n");
close (mypipe2[1]);
read_from_pipe (mypipe2[0]);
int i=0;
for(i=0;i<strlen(array);i++) printf("%c",array[i]);
printf("\n");
close (mypipe2[0]);
// write_to_pipe (mypipe[1],10);*/
return EXIT_SUCCESS;
}
}
SOAL PRAKTIKUM : SHIFT 11
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
char array[100];
void sighup1();
void sighup2();
void sighup3();
void sighup4();
void sighup5();
void sigint();
void sigquit();
void read_from_pipe (int file);
void write_to_pipe (int file,char arr[],int length);
main()
{
int pid;
int opsi=1;
int mypipe[2];
//int i=0;
char array_input[100];
char array_input2[100];
char pil[100];
int error=0;
while(opsi != 6)
{
error=0;
system("clear");
printf("+++++++++++++++++++++++++++++++++++++++++++\nFile Manager with
Signalling Implementation\n+++++++++++++++++++++++++++++++++++++++++++\n");
printf("Opsi :\n1. Buat File\n2. Hapus file\n3. Rename\n4. Cek File\n5.
Copy File\n6. Keluar\n");
printf("Masukkan pilihan anda : ");
scanf("%s",pil);
opsi=atoi(pil);
//scanf("%d",&opsi);
if(opsi>0 && opsi<6){
printf("Masukkan nama file : ");
scanf("%s",&array_input);
FILE *temp;
if(opsi==1 && (temp=fopen(array_input,"r"))!=0){
printf("File sudah ada,Ulangi lagi...\n");
error=1;
fclose(temp);
//exit(0);
}
if(error==0 && opsi>1 && opsi <6 &&
(temp=fopen(array_input,"r"))==0){
printf("File tidak ditemukan,Ulangi lagi...\n");
error=1;
//fclose(temp);
//exit(0);
}
if(error==0 && !(opsi==1||opsi==2||opsi==4)){
printf("Masukkan nama file tujuan : ");
scanf("%s",&array_input2);
if((temp=fopen(array_input2,"r"))!=0){
printf("File Tujuan sudah ada,Ulangi lagi...\n ");
fclose(temp);
error=1;
//exit(0);
}
strcat(array_input," ");
strcat(array_input,array_input2);
}
}
else if(opsi<1 && opsi>6)
{
printf("Pilihan hanya tersedia 1 - 6...\n");
error=1;
sleep(1);
}
if(error==0){
/* get child process */
pipe(mypipe);
if ((pid = fork()) < 0) {
perror("fork");
// exit(1);
}
if (pid == 0)
{ /* child */
close (mypipe[1]);
read_from_pipe (mypipe[0]);
signal(40,sighup1); /* set function calls */
signal(45,sighup2);
signal(50,sighup3);
signal(55,sighup4);
signal(60,sighup5);
signal(SIGQUIT, sigquit);
for(;;); /* loop for ever */
}
else /* parent */
{ /* pid hold id of child */
if(opsi==1){
close (mypipe[0]);
write_to_pipe (mypipe[1],array_input,strlen(array_input));
printf("\nPARENT: sending SIGNAL\n\n");
kill(pid,40);
}
else if(opsi==2){
close (mypipe[0]);
write_to_pipe (mypipe[1],array_input,strlen(array_input));
printf("\nPARENT: sending SIGNAL\n\n");
kill(pid,45);
}
else if(opsi==3){
close (mypipe[0]);
write_to_pipe (mypipe[1],array_input,strlen(array_input));
printf("\nPARENT: sending SIGNAL\n\n");
kill(pid,50);
}
else if(opsi==4){
close (mypipe[0]);
write_to_pipe
(mypipe[1],array_input,strlen(array_input));
printf("\nPARENT: Ukuran file : \n\n");
kill(pid,55);
}
else if(opsi==5){
close (mypipe[0]);
write_to_pipe
(mypipe[1],array_input,strlen(array_input));
printf("\nPARENT: Ukuran file : \n\n");
kill(pid,60);
}
else if(opsi==6){
printf("PARENT: sending SIGQUIT\n\n");
kill(pid,SIGQUIT);
}
sleep(1); /* pause for 3 secs */
}
}
else{
//char c =getchar();
sleep(2); /* pause for 3 secs */
}
}
}
void sighup1()
{
signal(40,sighup1); /* reset signal */
int i=0;
char command[100]="touch ";
strcat(command,array);
for(i=0;i<strlen(command);i++) printf("%c",command[i]);
system(command);
strcpy(command,"chmod 755 ");
strcat(command,array);
system(command);
printf("\nCHILD: Proses 1 sukses\n");
exit(0);
}
void sighup2()
{
signal(45,sighup2); /* reset signal */
int i=0;
char command[100]="rm ";
strcat(command,array);
for(i=0;i<strlen(command);i++) printf("%c",command[i]);
system(command);
printf("\nCHILD: Proses 2 Sukses\n");
exit(0);
}
void sighup3()
{
signal(50,sighup3); /* reset signal */
int i=0;
char command[100]="mv ";
strcat(command,array);
for(i=0;i<strlen(command);i++) printf("%c",command[i]);
system(command);
printf("\nCHILD: Proses 3 Sukses\n");
exit(0);
}
void sighup4()
{
signal(55,sighup3); /* reset signal */
int i=0;
char command[100]="du -h ";
strcat(command,array);
strcat(command," | awk '{print $1}'");
//for(i=0;i<strlen(command);i++) printf("%c",command[i]);
system(command);
printf("\nCHILD: Proses 4 Sukses\n");
exit(0);
}
void sighup5()
{
signal(60,sighup5); /* reset signal */
int i=0;
char command[100]="cp ";
strcat(command,array);
for(i=0;i<strlen(command);i++) printf("%c",command[i]);
system(command);
printf("\nCHILD: Proses 6 Sukses\n");
exit(0);
}
void sigint()
{
signal(SIGINT,sigint); /* reset signal */
printf("CHILD: I have received a SIGINT\n");
}
void sigquit()
{
printf("My DADDY has Killed me!!!\n");
exit(0);
}
void
read_from_pipe (int file)
{
FILE *stream;
int c;
int i=0;
stream = fdopen (file, "r");
while ((c = fgetc (stream)) != EOF){
array[i]=c;
i++;
}
fclose (stream);
}
void
write_to_pipe (int file,char arr[],int length)
{
FILE *stream;
stream = fdopen (file, "w");
int i=0;
for(i=0;i<length;i++){
fprintf (stream, "%c",arr[i]);
}
fclose (stream);
}