What is a System Call?
It is a method for a program to request a service from an operating system.
It is a method of interacting with the operating system via programs.
The Kernel system can only be accessed via system calls.
It is required for any program that uses resources.
Need of System Call
When file system wants to create, read, write and delete a file.
Network connections need them to send and receive data packets.
For accessing hardware devices like printer, scanner, etc.
For creating and managing new resources.
Working of System Call
When application creates a system call, it will first obtain permission from kernel.
It achieves this using an interrupt request, which pauses the current process and transfers control to the kernel.
Kernel executes requests, passes output to application, which resumes upon input reception.
When the operation is finished, the kernel returns the results to the application.
Modern operating system are multi-threaded, hence they can handle various system calls at same time.
Types of System Call
Process control
Used to direct the processes. Ex. load, abort, create, end, execute, terminate, etc.
File Management
Used to handle the files. Ex. create, delete, open, close, read, write.
Device Management
Used to deal with devices. Ex. read, write, get, delete.
Information Maintenance
Used to maintain information. Ex. getData, setData.
Communication
Used for communication. Ex. createConnection, deleteConnection, sendMessage, receiveMessage.
Example
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main() {
write(STDOUT_FILENO, "Hello, world!\n", 14);
int fd = open("example.txt", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd == -1) {
perror("open");
return 1;
}
const char *text = "Aditya Lad.\n";
ssize_t bytes_written = write(fd, text, strlen(text));
if (bytes_written == -1) {
perror("write");
close(fd);
return 1;
}
close(fd);
char buffer[100];
fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
ssize_t bytes_read = read(fd, buffer, sizeof(buffer));
if (bytes_read == -1) {
perror("read");
close(fd);
return 1;
}
write(STDOUT_FILENO, buffer, bytes_read);
close(fd);
return 0;
}
This code uses write, open, read and close system call.