Tuesday, October 11, 2011

Display the contents of a directory ( simulate DOS DIR command)

#include<stdio.h>
#include<dirent.h>
struct dirent *dptr;
int main(int argc, char *argv[]){
   DIR *dirp;
   dirp=opendir(argv[1]);
   if(dirp==NULL){
     printf("Error");
     exit(1);
   }
   while(dptr=readdir(dirp)){
     printf("%s\n",dptr->d_name);
   }
   closedir(dirp);
}

Output


Copy simulate -- Command Line Arguments

#include<stdio.h>
#include<stdlib.h>
int main(int n,char *args[])
{
   char command[100];
   int ret;
   if(n==3){
     sprintf(command,"cp %s %s",args[1],args[2]);
     ret=system(command);
     if(ret==0)
       printf("Successfully Copied from %s to %s\n",args[1],args[2]);
   }
   else
     printf("Invalid Command\n");
   return 0;
}

Output


Thursday, October 6, 2011

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);
      }
   }
}

Wednesday, September 21, 2011

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;
}

Parent creates shared memory to store N numbers and child find max and min number

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
   long shmid;
   key_t key;
   int *shm;
   int *s,shm_size,n,i,lar,smal;
   printf("\nEnter the limit :- ");
   scanf("%d",&n);
   shm_size=n*sizeof(long);
   key = 110200;
   if ((shmid = shmget(key, shm_size, IPC_CREAT | 0666)) < 0) {
     perror("shmget");
     exit(1);
   }
   if ((shm = shmat(shmid, NULL, 0)) == (int *) -1) {
     perror("shmat");
     exit(1);
   }
   s = shm;
   for(i=0;i<n;i++,s++)
     scanf("%d",s);
   if(fork()==0){
     s=shm;
     lar=*s;
     smal=*s;
     for(i=1;i<n;i++){
       if(*(s+i)>lar)
         lar=*(s+i);
       else if(*(s+i)<smal)
         smal=*(s+i);
     }
   }
   else{
     wait(NULL);
     return 0;
   }
   printf("\nLargest= %d \nSmallest= %d\n",lar,smal);
   return 0;
}

Parent send N strings to child and child return the palindromes

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(){
  int pid,a,n,p[2],p2[2],i,len,j,k,flag,n2=0;
  char buffr1[100][100],buffr2[100][100],buf[5];
  printf("Enter the limit:- ");
  scanf("%d",&n);
  a = pipe(p);
  if(a == -1)
  {
     fprintf(stderr, "Pipe Failed.\n");
     return EXIT_FAILURE;
  }
  a = pipe(p2);
   if(a == -1)
   {
     fprintf(stderr, "Pipe Failed.\n");
     return EXIT_FAILURE;
  }
   pid = fork();
   switch(pid){
     case -1:perror("main: fork");
       exit(1);
     case 0: read(p[0],buffr2,sizeof(buffr2));
       printf("In child process (ID: %d)\n", pid);
       for(i=0;i<n;i++){
         len=strlen(buffr2[i]);
         flag=0;
         for(j=0,k=len-1;j<len;j++,k--){
           if(buffr2[i][j]!=buffr2[i][k]){
             flag=1;
             break;
           }
         }
         if(flag==0){
           n2++;
           strcpy(buffr1[n2],buffr2[i]);
         }
       }
       buffr1[0][0]=n2;
       write(p2[1],buffr1,sizeof(buffr1));
       exit(1);
       break;
     default: printf("In parent process (ID: %d)\n", pid);
       for(i=0;i<n;i++){
         printf("Enter the string %d:- ",i+1);
         scanf("%s",buffr1[i]);
       }
       write(p[1],buffr1,sizeof(buffr1));
       waitpid(pid,NULL,0);
       read(p2[0],buffr2,sizeof(buffr2));
       printf("In parent process (ID: %d)\n", pid);
       n=(int) buffr2[0][0];
       for(i=1;i<=n;i++)
         printf("Paliandrome %d:- %s\n",i,buffr2[i]);
       break;
  }
   close(p[0]);
   close(p[1]);
   return 0;
}

Parent send N numbers to child and child return back the prime numbers

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
   int pid,a,n,p[2],p2[2],i,j,buffr1[100],buffr2[100],flag,n2=0;
a = pipe(p);
   if(a == -1)
   {
       fprintf(stderr, "Pipe Failed.\n");
       return EXIT_FAILURE;
    }
   a=pipe(p2);
   if(a == -1)
    {
       fprintf(stderr, "Pipe Failed.\n");
       return EXIT_FAILURE;
    }
    pid = fork();
   switch(pid){
       case -1:perror("main: fork");
          exit(1);
       case 0: n=read(p[0],buffr2,sizeof(buffr2));
          printf("In child process (ID: %d)\n", pid);
          n=n/sizeof(int);
          for(i=0;i<n;i++){
             flag=0;
             if(buffr2[i]<=1)
                flag=1;
             for(j=2;j<=buffr2[i]/2;j++){
                if((buffr2[i]%j)==0)
                {
                   flag=1;
                   break;
                }
             }
             if(flag==0){
                buffr1[n2]=buffr2[i];
                n2++;
             }
          }
          write(p2[1],buffr1,n2*sizeof(int));
          exit(1);
          break;
       default: printf("In parent process (ID: %d)\n", pid);
          printf("Enter the limit:- ");
          scanf("%d",&n);
          for(i=0;i<n;i++){
             printf("Enter the element %d:- ",i+1);
             scanf("%d",&buffr1[i]);
          }
          write(p[1],buffr1,n*sizeof(int));
          waitpid(pid,NULL,0);
          printf("In parent process (ID: %d)\n", pid);
          n2=read(p2[0],buffr2,sizeof(buffr2));
          n2=n2/sizeof(int);
          for(i=0;i<n2;i++)
             printf("Prime Number %d:- %d\n",i+1,buffr2[i]);
          break;
       }
      close(p[0]);
       close(p[1]);
      return 0;
}