Introduction in to System Calls and Process Management

Download Report

Transcript Introduction in to System Calls and Process Management

CS345
Operating Systems
Φροντιστήριο Άσκησης 2
Inter-process communication
• Exchange data among processes
• Methods
– Signal
– Pipe
– Sockets
Echo server
• Sits and waits on client connections
• Echoing messages
• Version 1: same machine
– Named pipes
• Version 2: different machines
– Sockets
Pipes
• Chain of processes arranged so that the
output of each process is the input of the
next
Named pipes
• Special file that is used to transfer data
between unrelated processes
• Client writes to it and echo server reads
from it
The mkfifo()system call
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
• Creates a named pipe
– with name pathname
– mode specifies the permissions
How do I use a named pipe?
• Open it like a normal file
• Use read() and write()
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
• Close it like a normal file
• The unlink() system call deletes a
name and the file it refers to
Sockets
• endpoint of communication link between
two programs running on the network
• inter-process communication flow across a
computer network
Socket Types
• Stream sockets, also known as connectionoriented sockets, provides sequenced, reliable,
two-way, connection-based byte streams.
• Datagram sockets, also known as
connectionless sockets.
Socket Functions (1/5)
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
• create an endpoint for communication
– The domain argument specifies a communication
domain (“AF_INET”, “AF_UNIX”, etc)
– type specifies the communication semantics
(“SOCK_STREAM”, “SOCK_DGRAM”, etc)
– protocol  set to 0
Socket Functions (2/5)
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
• assigns the address specified to by addr to the socket referred
to by the file descriptor sockfd
• addrlen specifies the size, in bytes, of the address structure
pointed to by addr ( sizeof(struct sockaddr_in) )
struct sockaddr_in {
sa_family_t sin_family ; //= AF_INET
in_port_t sin_port ; //into network byte order
struct in_addr sin_addr ;};
struct in_addr {
u_int32_t s_addr; };
Socket Functions (3/5)
#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog);
• Listen for connections on a socket
– sockfd: file descriptor that refers to a socket
– backlog: number of allowed connections
Socket Functions (4/5)
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr,
socklen_t *addrlen);
• Accept a connection on a socket
– Arguments same as bind function
– addr: client’s information
Socket Functions (5/5)
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
• Initiate a connection on a socket
– Called by the client
send/recv Functions
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf,
size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len,
int flags);
• The message is found in buf and has length len
• flag: 0, by default:
Useful functions
#include <arpa/inet.h>
Uint16_t htons(uint16_t hostshort);
Convert multi-byte integer types from host byte order to network byte order.
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
Convert IPv4 and IPv6 addresses from text to binary form
e.g.: inet_pton(AF_INET, server_ip, &addr.sin_addr)
#include <netdb.h>
struct hostent *gethostbyname(const char *name);
Return a structure with information for the host name (can be an IP address)
Server example
struct sockaddr_in server_addr, client_addr;
sock = socket(AF_INET, SOCK_STREAM, 0);
server_addr = …
bind(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr));
listen(sock, 5);
while(1){
connected = accept(sock, (struct sockaddr
*)&client_addr,&(sizeof(struct sockaddr_in)));
//recv and send operations
}
close(sock);
Client example
struct sockaddr_in server_addr;
sock = socket(AF_INET, SOCK_STREAM, 0);
server_addr = …
connect(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr));
while(1){
//send and recv operations
}
close(sock);