Monday, 2 December 2013

Process X gives a file name and value n to process Y. Y has to copy first n lines of file into a new file and sent the file name back to X who display the content of new file. Implement using pipes.

#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int pid,p[2],p2[2],i,n,n2,num,check,a,j;
char buff1[100][100],buff2[100][100],ch,src[30],des[30];
FILE *source,*dest;
a = pipe(p);
if(a==-1)
{
perror("error pipe 1");
exit(1);
}
a = pipe(p2);
if(a==-1)
{
perror("error pipe 2");
exit(1);
}
pid = fork();
switch(pid)
{
case -1: perror("fork");
exit(1);
break;
case 0:
read(p[0],buff2,sizeof(buff2));
printf("In child process (PID : %d ) \n",pid);

int l,i;
strcpy(src,buff2[0]);
l = (int)buff2[1][0] - 48; //ASCII of 0 is 48
printf("\nsource file name : %s",src);
printf("\nNmber of line : %d",l);
printf("\nEnter destination file name : ");
gets(des);
source = fopen(src,"r");
dest = fopen(des,"w");
i=1;
l=2; //dummy
while(i<=l)
{
while( (ch=fgetc(source)) != '\n')
{
fputc(ch,dest);
}
fputc('\n',dest);
i++;
}
strcpy(buff1[0],des);
write(p2[1],buff1,sizeof(buff1));
exit(1);
break;

default: printf("In parent process (PID: %d) \n",pid);

printf("enter file name : ");
scanf("%s",buff1[0]);

printf("enter line limit : ");
scanf("%s",buff1[1]);

write(p[1],buff1,sizeof(buff1));
waitpid(pid,NULL,0);
printf("In parent process (PID: %d) \n",pid);
read(p2[0],buff2,sizeof(buff2));

printf("\nnew file created %s ",buff2[0]);

break;
}
close(p[0]);
close(p[1]);
close(p2[0]);
close(p2[1]);
return 0;
}

X sends N numbers to Y who select prime numbers and send them to Z. Z send the sum of primes to X who displays the result. Implement IPC using pipes. X,Y,Z are processes.

#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int pid,pid1,p[2],p2[2],p3[2],buff1[100],buff2[100],i,n,n2,num,check,a,j;
int sum=0;
printf("Enter limit : ");
scanf("%d",&n);
n2=0;
a = pipe(p);
if(a==-1)
{
perror("error pipe 1");
exit(1);
}
a = pipe(p2);
if(a==-1)
{
perror("error pipe 2");
exit(1);
}
a = pipe(p3);
if(a==-1)
{
perror("error pipe 3");
exit(1);
}
pid = fork();
switch(pid)
{
case -1: perror("fork");
exit(1);
break;
case 0: n2 = read(p2[0],buff2,sizeof(buff2));
printf("In child process Z (PID : %d ) \n",pid);
n2 = n2/sizeof(int);

printf("value of n2: %d",n2);
for(i=0;i<n2;i++)
{
printf("\nPrime numbers %d : %d",i+1,buff2[i]);
sum = sum + buff2[i];
}
buff1[0] = sum;
write(p3[1],buff1,sizeof(int));
exit(1);
break;

default:
pid1 = fork();
switch(pid1)
{
case -1: perror("fork");
exit(1);
break;

case 0 :
read(p[0],buff2,sizeof(buff2));
printf("In child process Y (PID1 : %d ) \n",pid1);
for(i=0;i<n;i++)
{
int flag=1;
num = buff2[i];
if(num < 2)
{
flag=0;
}
else
{
check = sqrt(num);
for(j=2;j<=check;j++)
{
if(num%j == 0)
{
flag=0;
break;
}
}
}
if(flag==1)
{
buff1[n2] = num;
n2++;
}
}
write(p2[1],buff1,n2*sizeof(int));
exit(1);
break;
default: printf("In parent process X (PID: %d) \n",pid1);
for(i=0;i<n;i++)
{
printf("enter element %d : ",i+1);
scanf("%d",&buff1[i]);
}
write(p[1],buff1,n*sizeof(int));
waitpid(pid1,NULL,0);
printf("\nIn parent process (PID: %d) \n",pid1);
read(p3[0],buff2,sizeof(buff2));
printf("\nsum : %d\n",buff2[0]);
}
break;
}
close(p[0]);
close(p[1]);
close(p2[0]);
close(p2[1]);
close(p3[0]);
close(p3[1]);
return 0;
}


OUTPUT:
$ gcc program.c -lm -o prog (NOTE: -lm is important to compile math functions like sqrt)
$ ./prog

Enter limit : 3
In parent process X (PID: 4773)
enter element 1 : 1
enter element 2 : 2
enter element 3 : 5
In child process Y (PID1 : 0 )
In child process Z (PID : 0 )
value of n2: 2
Prime numbers 1 : 2
Prime numbers 2 : 5
In parent process (PID: 4773)
sum : 7

UDP Client-Server Chat Session

SERVER:

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define BUFLEN 512
#define PORT 9930

void err(char *str)
{
    perror(str);
    exit(1);
}

int main(void)
{
    struct sockaddr_in my_addr, cli_addr;
    int sockfd, i;
    socklen_t slen=sizeof(cli_addr);
    char buf[BUFLEN];

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
      err("socket");
    else
      printf("Server : Socket() successful\n");

    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(PORT);
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
   
    if (bind(sockfd, (struct sockaddr* ) &my_addr, sizeof(my_addr))==-1)
      err("bind");
    else
      printf("Server : bind() successful\n");

    while(1)
    {
        if (recvfrom(sockfd, buf, BUFLEN, 0, (struct sockaddr*)&cli_addr, &slen)==-1)
            err("recvfrom()");
        printf("Received packet from %s:%d\nData: %s\n\n",
               inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port), buf);
    }

    close(sockfd);
    return 0;
}


CLIENT:

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define BUFLEN 512
#define PORT 9930

void err(char *s)
{
    perror(s);
    exit(1);
}

int main(int argc, char** argv)
{
    struct sockaddr_in serv_addr;
    int sockfd, i, slen=sizeof(serv_addr);
    char buf[BUFLEN];

    if(argc != 2)
    {
      printf("Usage : %s <Server-IP>\n",argv[0]);
      exit(0);
    }

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
        err("socket");

    bzero(&serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    if (inet_aton(argv[1], &serv_addr.sin_addr)==0)
    {
        fprintf(stderr, "inet_aton() failed\n");
        exit(1);
    }

    while(1)
    {
        printf("\nEnter data to send(Type exit and press enter to exit) : ");
        scanf("%[^\n]",buf);
        getchar();
        if(strcmp(buf,"exit") == 0)
          exit(0);

        if (sendto(sockfd, buf, BUFLEN, 0, (struct sockaddr*)&serv_addr, slen)==-1)
            err("sendto()");
    }

    close(sockfd);
    return 0;
}


HOW TO RUN:
1: open terminal
2: gcc  server.c
3: ./a.out

4: open another terminal
5: gcc client.c
6: ./a.out <server-ip> (check the ip of the machine and put here)

OUTPUT:
SERVER SIDE
$ ./a.out
Server : Socket() successful
Server : bind() successful
Received packet from 192.168.0.3:37555
Data: hi

Received packet from 192.168.0.3:37555
Data: hello

Received packet from 192.168.0.3:37555
Data: i m client

CLIENT SIDE
$ ./a.out 192.168.0.3
Enter data to send(Type exit and press enter to exit) : hi

Enter data to send(Type exit and press enter to exit) : hello

Enter data to send(Type exit and press enter to exit) : i m client

TCP Client-Server Chat Session

SERVER:

#include<stdio.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<stdlib.h>
#include<string.h>
#define MAX 80
#define PORT 43454
#define SA struct sockaddr
void func(int sockfd)
{
char buff[MAX];
int n;
for(;;)
{
bzero(buff,MAX);
read(sockfd,buff,sizeof(buff));
printf("From client: %s To client : ",buff);
bzero(buff,MAX);
n=0;
while((buff[n++]=getchar())!='\n');
write(sockfd,buff,sizeof(buff));
if(strncmp("exit",buff,4)==0)
{
printf("Server Exit...\n");
break;
}
}
}
int main()
{
int sockfd,connfd,len;
struct sockaddr_in servaddr,cli;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
printf("socket creation failed...\n");
exit(0);
}
else
printf("Socket successfully created..\n");
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(PORT);
if((bind(sockfd,(SA*)&servaddr, sizeof(servaddr)))!=0)
{
printf("socket bind failed...\n");
exit(0);
}
else
printf("Socket successfully binded..\n");
if((listen(sockfd,5))!=0)
{
printf("Listen failed...\n");
exit(0);
}
else
printf("Server listening..\n");
len=sizeof(cli);
connfd=accept(sockfd,(SA *)&cli,&len);
if(connfd<0)
{
printf("server acccept failed...\n");
exit(0);
}
else
printf("server acccept the client...\n");
func(connfd);
close(sockfd);
}


CLIENT:

#include<stdio.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<string.h>
#include<stdlib.h>
#define MAX 80
#define PORT 43454
#define SA struct sockaddr
void func(int sockfd)
{
char buff[MAX];
int n;
for(;;)
{
bzero(buff,sizeof(buff));
printf("Enter the string : ");
n=0;
while((buff[n++]=getchar())!='\n');
write(sockfd,buff,sizeof(buff));
bzero(buff,sizeof(buff));
read(sockfd,buff,sizeof(buff));
printf("From Server : %s",buff);
if((strncmp(buff,"exit",4))==0)
{
printf("Client Exit...\n");
break;
}
}
}

int main()
{
int sockfd,connfd;
struct sockaddr_in servaddr,cli;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
printf("socket creation failed...\n");
exit(0);
}
else
printf("Socket successfully created..\n");
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
servaddr.sin_port=htons(PORT);
if(connect(sockfd,(SA *)&servaddr,sizeof(servaddr))!=0)
{
printf("connection with the server failed...\n");
exit(0);
}
else
printf("connected to the server..\n");
func(sockfd);
close(sockfd);
}


HOW TO RUN:
1: open terminal
2: gcc server.c
3: ./a.out

4: open another terminal
5: gcc client.c
6: ./a.out

OUTPUT:
SERVER SIDE
$ gcc server.c
$ ./a.out
Socket successfully created..
Socket successfully binded..
Server listening..
server acccept the client...
From client: hi
To client : hello
From client: exit
To client : exit
Server Exit...
$

CLIENT SIDE
$ gcc client.c
$ ./a.out
Socket successfully created..
connected to the server..
Enter the string : hi
From Server : hello
Enter the string : exit
From Server : exit
Client Exit...



Producer-consumer problem

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/sem.h>
#define EMPTY 0
#define FULL 1
#define MUTEX 2
#define SIZE 10
void up(int sem_id,int sem_num,struct sembuf *semaphore){
  semaphore->sem_num=sem_num;
   semaphore->sem_op=1;
   semaphore->sem_flg=0;
   semop(sem_id,semaphore,1);
}
void down(int sem_id,int sem_num,struct sembuf *semaphore){
   semaphore->sem_num=sem_num;
   semaphore->sem_op=-1;
   semaphore->sem_flg=0;
   semop(sem_id,semaphore,1);
}
void initsem(int sem_id,int sem_num,int val){
   union semnum{
      int val;
      struct semid_ds *buf;
      unsigned short *array;
   }argument;
   argument.val=val;
  semctl(sem_id,sem_num,SETVAL,argument);
}
int main(){
   key_t shm_key=1234,sem_key=3456;
   int shm_id,sem_id;
   int *shm;
   struct sembuf semaphore;
   shm_id=shmget(shm_key,SIZE+1,IPC_CREAT|0666);
   sem_id=semget(sem_key,3,IPC_CREAT|0666);
   shm=shmat(shm_id,NULL,0);
  shm[0]=0;
  initsem(sem_id,EMPTY,SIZE);
   initsem(sem_id,FULL,0);
  initsem(sem_id,MUTEX,1);
   if(fork()==0){
      while(1){
         int item,i;
         sleep(2);
         down(sem_id,FULL,&semaphore);
         down(sem_id,MUTEX,&semaphore);
         item=shm[1];
         for(i=1;i<shm[0];i++)
           shm[i]=shm[i+1];
         shm[0]--;
         printf("\nConsumed %d",item);
         up(sem_id,MUTEX,&semaphore);
         up(sem_id,EMPTY,&semaphore); 
      }
  }
  else{
      while(1){
         int item=random()%10;
         sleep(1);
         down(sem_id,EMPTY,&semaphore);
         down(sem_id,MUTEX,&semaphore);
         shm[++shm[0]]=item;
         printf("\nProduced %d",item);
         up(sem_id,MUTEX,&semaphore);
         up(sem_id,FULL,&semaphore); 
      }
   }
}

Parent creates shared memory to store N names and child display the names in alphabetical order

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h> 
#include <string.h>
int main()
{
   long shmid,shm_size;
   key_t key;
   char *shm,*s;
   int n,i;
   printf("\nEnter the limit :- ");
   scanf("%d",&n);
   shm_size=n*30*sizeof(char);
   key = 11021;
   if ((shmid = shmget(key, shm_size, IPC_CREAT | 0666)) < 0) {
   perror("shmget");
   exit(1);
   }
   if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
   perror("shmat");
   exit(1);
   }
   s = shm;
   for(i=0;i<n;i++,s=s+20)
   scanf("%s",s);
   if(fork()==0){
     s=shm;
     int j,temp;
     char t[20];
     for(i=0;i<n-1;i++){
       temp=i;
         for(j=i+1;j<n;j++)
           if(strcmp(s+(20*temp),s+(20*j))>0)
           temp=j;
       strcpy(t,s+(20*i));
       strcpy(s+(20*i),s+(20*temp));
       strcpy(s+(20*temp),t);
     }
   }
   else{
     wait(NULL);
     return 0;
   }
   s=shm;
   printf("Alphabetical Order\n");
   for(i=0;i<n;i++,s=s+20)
     printf("%s\n",s);
   return 0;
}