..

 


2. Simple shell script for basic arithmetic and logical calculations.


#!/bin/sh


a=2


b=4


c=3


val=`expr $a + $b`


echo "Sum = $val"


val=`expr $a - $b`


echo "Difference= $val"


val=`expr $a \* $b`


echo "Product = $val"


val=`expr $b / $a`


echo "quotient = $val"


val=`expr $a % $b`


echo "Modulus = $val"


if [ $a == $b ]


then


echo “a is equal to b”


else


echo “a is not equal to b”


fi


if [ $a != $b ]


then


echo “a is equal to b”


else


echo “a is not equal to b”


fi


if [ $a -lt 10 -o $b -gt 20 ]


then


echo “true”


else


echo “false”


fi


if [ $a -lt 10 -a $b -gt 20 ]


then


echo “True”


else


echo “False”


fi


[LabExam@ISELAB1 ~]$chmod a+x pr2.sh /*To execute your shell program, use chmod a+x program name(For changing mode), a+x means giving execute permission to all three category of people(user,group,others).*/


[LabExam@ISELAB1 ~]$sh pr2.sh /*To run the program use any of the methods: sh program name or ./ program name*/


Sum = 8


Difference = -2


Product =8


Quotient =2


Modulus =2


a is not equal to b


a is not equal to b


True


False


3. Shell scripts to check various attributes of files and directories.


#!/bin/sh


file="filename.sh"


if [ -r $file ]


then


echo "File has read permission"


else


echo "File does not have read permission"


fi


if [ -w $file ]


then


echo "File has write permission"


else


echo "File does not have write permission"


fi


 if [ -x $file ]


 then


echo "File has execute permission"


else


echo "File does not have execute permission"


fi


if [ -f $file ]


then


echo "File is an ordinary file"


else echo "This is a special file"


fi


 if [ -d $file ]


then


echo "File is a directory"


else


 echo "File is not a directory"


 fi


if [ -s $file ]


 then


 echo "File size is zero"


 else


echo "File size is greater than zero"


 fi


 if [ -e $file ]


 then


echo "File exists"


 else


echo "File does not exist"


fi


if [ -b $file ]


 then


echo "File is a block file "


 else


echo "File is not a block file"


fi


if [ -c $file ]


 then


echo "File is a character file "


 else


echo "File is not a character file"


fi


output: [LabExam@ISELAB1 ~]$ sh pr3.sh


[LabExam@ISELAB1 ~]$chmod a+x pr3.sh


[LabExam@ISELAB1 ~]$sh pr3.sh


File has read permission


File has write permission


File has execute permission


File is an ordinary file


File size is greater than zero


File exists


File is not a character file is not a block file


4. Shell scripts to check and list attributes of processes.


!/bin/sh


ps


echo "ps : process status"


ps -f


echo "ps -f : full listing"


ps -l


echo "ps -l : along listing showing memory related information"


ps -u


echo "ps -u : process of user only"


ps -e


echo "ps -e : all process including user and system process"


ps -a


echo "ps -a : process of all user including processes not listed with terminal"


ps -t


echo "ps -t : processes running on terminal -l along listing showing memory related information"


output:


 [LabExam@ISELAB1 ~]$ sh pr4.sh


[LabExam@ISELAB1 ~]$chmod a+x pr4.sh


[LabExam@ISELAB1 ~]$sh pr4.sh


  PID TTY TIME CMD


 2053 pts/0 00:00:00 bash


 2422 pts/0 00:00:00 listing.sh


 2423 pts/0 00:00:00 ps


ps = process status


UID PID PPID C STIME TTY TIME CMD


admin 2053 2043 0 10:46 pts/0 00:00:00 bash


admin 2422 2053 0 11:03 pts/0 00:00:00 /bin/sh ./listing.sh


admin 2424 2422 0 11:03 pts/0 00:00:00 ps -f


ps -f=full listing


F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD


0 S 1000 2053 2043 0 80 0 - 2306 wait pts/0 00:00:00 bash


0 S 1000 2422 2053 0 80 0 - 2045 wait pts/0 00:00:00 listing.sh


0 R 1000 2425 2422 0 80 0 - 2868 - pts/0 00:00:00 ps


ps -l=along listing showing memory related information


USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND


admin 1403 0.0 0.2 54036 9432 tty2 Ssl+ 10:46 0:00 /usr/libexec/gd


admin 1408 0.0 0.3 84184 12864 tty2 Sl+ 10:46 0:00 /usr/libexec/gn


admin 1510 3.3 3.8 1117800 135452 tty2 Sl+ 10:46 0:34 /usr/bin/gnome-


admin 1538 0.0 1.2 155672 44816 tty2 Sl+ 10:46 0:00 /usr/bin/Xwayla


admin 1571 0.3 0.2 52168 7748 tty2 Sl 10:46 0:03 ibus-daemon --x


ps -u=process of user only


PID TTY TIME CMD


    1 ? 00:00:01 systemd


    2 ? 00:00:00 kthreadd


    3 ? 00:00:00 rcu_gp


    4 ? 00:00:00 rcu_par_gp


    6 ? 00:00:00 kworker/0:0H-kb


  ps -e=all process including user and system process


PID TTY TIME CMD


  868 tty1 00:00:00 gnome-session-b


  907 tty1 00:00:03 gnome-shell


 1136 tty1 00:00:00 Xwayland


 1163 tty1 00:00:00 ibus-daemon


 1166 tty1 00:00:00 ibus-dconf


 ps -a=process of all user including processes not listed with terminal


 PID TTY STAT TIME COMMAND


 2053 pts/0 Ss 0:00 bash


 2422 pts/0 S+ 0:00 /bin/sh ./listing.sh


 2429 pts/0 R+ 0:00 ps -t


ps -t=processes running on terminal -l along listing showing memoryb related information




5. Write awk script that uses all of its features.


#!/bin/awk -f


BEGIN {print “START”}


{print $1, “\t”, $3}


END {print “DONE”}


output:


 [LabExam@ISELAB1 ~]$ awk -f pr5.awk a.txt


And am


You can


Me you


LabExam@ISELAB1 ~]$ cat a.txt


And is am I was


You they can take


Me as you print


6. Write a shell script to display list of users currently logged in.


#!/bin/sh


echo “User logged in:”


users


echo “Current logged in date and time :”


date


echo “Currently logged in users:”


who


echo “Currently logged in username:”


whoami


output:


 [LabExam@ISELAB1 ~]$ sh pr6.sh


[LabExam@ISELAB1 ~]$chmod a+x pr6.sh


[LabExam@ISELAB1 ~]$sh pr6.sh


User logged in:


UNIX LAB UNIX LAB


Current logged in date and time:


Sat sep 29 12:25:30 IST 2018-11-22


Currently logged in users:


UNIXLAB TTY1 2018-09-29 11.08 (:0)


UNIXLAB pts/0 2018-09-29 12.03 (:0.0)


UNIXLAB pts/1 2018-09-29 12.28 (:0.0)


Currently logged in username:


UNIXLAB



PART B


1. Write a C/C++ program to implement the cat command using general file API’s.


#include<sys/types.h>


#include<sys/stat.h>


#include<stdio.h>


#include<fcntl.h>


main( int argc,char *argv[3] )


{


int fd,i;


char buf[2];


fd=open(argv[1],O_RDONLY,0777);


if(fd==-argc)


{


printf("file open error");


}


else


{


while((i=read(fd,buf,1))>0)


{


printf("%c",buf[0]);


}


close(fd);


}


}


Output: [UNIXLAB@localhost ~]$ gcc -0 p.out prgm1.c


UNIXLAB@localhost ~]$cat >h.txt /*creating a text file*/


hello


UNIXLAB@localhost ~]$./p.out h.txt /*appending text file to display contents on the terminal without using cat command*/


hello


2. Write a C/C++ program to implement the cp (copy) command using general file API’s.


#include <stdio.h>


#include <stdlib.h


#include <fcntl.h>


#include <errno.h>


#define BUFF_SIZE 1024


int main(int argc, char* argv[])


{


 int srcFD,destFD,nbread,nbwrite;


 char *buff[BUFF_SIZE];


 /*Check if both src & dest files are received*/


 if(argc != 3)


 {


  printf("\nUsage: cpcmd source_file destination_file\n");


  exit(EXIT_FAILURE);


 }


 /*Open source file*/


 srcFD = open(argv[1],O_RDONLY);


 if(srcFD == -1)


 {


  printf("\nError opening file %s errno = %d\n",argv[1],errno);


  exit(EXIT_FAILURE);


 }


 /*Open destination file with respective flags & modes


   O_CREAT & O_TRUNC is to truncate existing file or create a new file


   S_IXXXX are file permissions for the user,groups & others*/


 destFD = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR |


S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);


 if(destFD == -1)


 {


  printf("\nError opening file %s errno = %d\n",argv[2],errno);


  exit(EXIT_FAILURE);


 }


 /*Start data transfer from src file to dest file till it reaches EOF*/


 while((nbread = read(srcFD,buff,BUFF_SIZE)) > 0)


 {


  if(write(destFD,buff,nbread) != nbread)


   printf("\nError in writing data to %s\n",argv[2]);


 }


 if(nbread == -1)


  printf("\nError in reading data from %s\n",argv[1]);


 if(close(srcFD) == -1)


  printf("\nError in closing file %s\n",argv[1]);


 if(close(destFD) == -1)


  printf("\nError in closing file %s\n",argv[2]);


 exit(EXIT_SUCCESS);


}


Output: Output: gcc prgm2.c


[UNIXLAB@localhost ~]$ ./a.out q.txt j.txt


UNIXLAB@localhost ~]$cat q.txt


hello


UNIXLAB@localhost ~]$cat j.txt


hello


3. Write a C/C++ program to implement the ln/rename command using general file API’s.


#include <stdio.h>


#include<unistd.h>


int main(int argc, char *argv[])


{


if(argc!=3)


{


printf(“usage: %s <src_file><dest_file>\n”,argv[0]);


Return 0;


}


if(link(argv[1],argv[2])==-1)


{


printf(“link error\n”);


return 1;


}


printf(“files linked\n”);


printf(“Inode number of linked files\n”);


char str[100];


sprint(str,”ls –i %s %s \n”,argv[1],argv[2]);


system(str);


return 0;


}


Output: gcc prgm1.c


[UNIXLAB@localhost ~]$ ./a.out j.txt q.txt


Files linked


Inode number of linked files


416529 j.txt 416529 q.txt


4. Write a C/C++ program to create a file called file1 in blocking read-write mode and show how you can use fcntl api to modify its access control flags to non-blocking read-write mode.


#include<stdio.h>


#include<sys/types.h>


#include<fcntl.h>


#include<stdlib.h>


int main(int argc,char *argv[])


{


int accmode,val;


if(argc!=2)


{


fprintf(stderr,"usage:%s <description>",argv[0]);


exit(1);


}


val=fcntl(atoi(argv[1]),F_GETFL,0); /* F_GETFL (void)


              Return (as the function result) the file access mode and the


              file status flags;*/


if(val<0)


{


perror("fcntl error for fd");


exit(1);


}


accmode=val & O_ACCMODE; /*This macro stands for a mask that can be bitwise-ANDed with the file status flag value to produce a value representing the file access mode. The mode will be O_RDONLY, O_WRONLY, or O_RDWR.*/


if(accmode==O_RDONLY)


printf("read only");


else if(accmode==O_WRONLY)


printf("Write only");


else if(accmode==O_RDWR)


printf("read write");


else


{


fprintf(stderr,"unknown access mode");


exit(1);


}


if(val & O_APPEND)


printf(",append");


if(val & O_NONBLOCK)


printf(",nonblocking");


if(val & O_SYNC)


printf(",synchronous write"); /*wait for writes to complete (data and attributes)*/


putchar('\n');


exit(0);


}


Output:


 gcc p22.c


[UNIXLAB@localhost ~]$ ./a.out p22.c


Read-Write


5.Write a C/C++ program to duplicate the file descriptor of a file Foo to standard input file descriptor.


#include<stdlib.h>


#include<unistd.h>


#include<sys/types.h>


#include<sys/stat.h>


#include<fcntl.h>


#include<stdio.h>


int main(int argc,char **argv)


{


int fd,nfd;


if(argc<2){


printf("usage:%s pathname\n",argv);


exit(1);


}


if((fd=open(argv[1],O_WRONLY))<0)


{


perror("Problem in opening the file");


exit(1);


}


if((nfd=fcntl(fd,F_DUPFD,0))==-1)


{


perror("Problem in duplicating fd");


exit(1);


}


printf("Fd %d duplicated with %d\n",fd,nfd);


close(fd);


close(nfd);


}


Output: gcc prgm.c


[UNIXLAB@localhost ~]$ ./a.out ll.txt


Fd 3 duplicated with 4


gcc prgm.c


[UNIXLAB@localhost ~]$ ./a.out ll.txt


Fd 3 duplicated with 4


6.Write a C/C++ program to query and display the different attributes associated with a file.


#include<stdio.h>


#include<sys/types.h>


#include<sys/stat.h>


#include<time.h>


#include<stdlib.h>


int main(int argc, char *argv[])


{


struct stat sb;


if(argc!=2)


{


fprintf(stderr,"usage: %s <pathname>\n", argv[0]);


exit(EXIT_FAILURE);


}


if(stat(argv[1],&sb)==-1)


{


perror("stat");


exit(EXIT_FAILURE);


}


printf("file type: ");


switch(sb.st_mode & S_IFMT)


{


case S_IFBLK: printf("block device file\n");


       break;


case S_IFCHR: printf("character device file\n");


       break;


case S_IFDIR: printf("directory\n");


       break;


case S_IFIFO: printf("FIFO/pipe\n");


       break;


case S_IFLNK: printf("symlink\n");


       break;


case S_IFREG: printf("regular file\n");


       break;


case S_IFSOCK: printf("socket\n");


        break;


default: printf("regular file\n");


        break;


}


printf("Inode number: %ld\n", (long) sb.st_ino);


printf("Mode: %lo(octal)\n", (unsigned long) sb.st_mode);


printf("Blocks allocated: %lld\n", (long long) sb.st_blocks);


exit(EXIT_SUCCESS);


}


Output: gcc prgm.c


[UNIXLAB@localhost ~]$ ./a.out prgm.c


File type: regular


Inode number: 1067168


Mode: 100664(octal)


Blocks allocated: 8


struct stat {


    dev_t st_dev; /* ID of device containing file */


    ino_t st_ino; /* Inode number */


    mode_t st_mode; /* File type and mode */


    nlink_t st_nlink; /* Number of hard links */


    uid_t st_uid; /* User ID of owner */


    gid_t st_gid; /* Group ID of owner */


    dev_t st_rdev; /* Device ID (if special file) */


    off_t st_size; /* Total size, in bytes */


    blksize_t st_blksize; /* Block size for filesystem I/O */


    blkcnt_t st_blocks; /* Number of 512B blocks allocated */


    time_t st_atime; /* Time of last access */


    time_t st_mtime; /* Time of last modification */


    time_t st_ctime; /* Time of last status change */


};


7.Write C/C++ program to read and display the last 10 character’s of the input file.


#include<stdio.h>


#include<stdlib.h>


int main()


{


FILE *fp;


char ch;


int num;


long length;


printf("Enter the value of num:");


scanf("%d",&num);


fp=fopen("file.txt","r");


if(fp==NULL)


{


puts("Cannot open this file");


exit(1);


}


fseek(fp,-1,SEEK_END);


length=ftell(fp);


fseek(fp,(length-num),SEEK_SET);


do


{


ch=fgetc(fp);


putchar(ch);


}while(ch!=EOF);


fclose(fp);


return(0);


}


Output


cat > l.txt


hello world hai beautiful girl


gcc p55.c


[UNIXLAB@localhost ~]$ ./a.out p55.c


Enter the value of num:4


Girl


8.Write a C/C++ program to demonstrate masking of read/write/execute permission of a specified input file for user group and others category.


#include<sys/types.h>


#include<sys/stat.h>


#include<stdio.h>


int main()


{


mode_t oldMask,newMask;


oldMask=umask((mode_t)0);


printf("\n Old mask = %on",(int)oldMask);


if(oldMask & S_IRGRP){


printf("\nChanging group read permission from Masked to unmasked.n");


oldMask=(oldMask ^ S_IRGRP);/* ^ Operator is binar XOR operator, copies the bit if it is set in one operand but not in both. Exclusive or is a logical operator that outputs true only when inputs differ*/


}


newMask=(oldMask|S_IWGRP|S_IXGRP);


umask(newMask);


printf("\nNew MAsk = %onn",(int)newMask);


printf("\nThe file mode creation mask now specifies:nn");


printf("\n Group read permission UNMASKEDn");


printf("\n Group write permission MASKEDn");


printf("\n Group execute permission MASKEDn");


oldMask=umask((mode_t)0);


printf("\n Old mask = %on",(int)oldMask);


if(oldMask & S_IRUSR){


printf("\nChanging user read permission from Masked to unmasked.n");


oldMask=(oldMask ^ S_IRUSR);


}


newMask=(oldMask|S_IWUSR|S_IXUSR);


umask(newMask);


printf("\nNew MAsk = %onn",(int)newMask);


printf("\nThe file mode creation mask now specifies:nn");


printf("\n User read permission UNMASKEDn");


printf("\n User write permission MASKEDn");


printf("\n User execute permission MASKEDn");


oldMask=umask((mode_t)0);



printf("\n Old mask = %on",(int)oldMask);


if(oldMask & S_IROTH){


printf("\nChanging Other read permission from Masked to unmasked.n");


oldMask=(oldMask ^ S_IROTH);


}


newMask=(oldMask|S_IWOTH|S_IXOTH);


umask(newMask);


printf("\nNew MAsk = %onn",(int)newMask);


printf("\nThe file mode creation mask now specifies:nn");


printf("\n Other read permission UNMASKEDn");


printf("\n Other write permission MASKEDn");


printf("\n Other execute permission MASKEDn");


}


Output:


gcc p77.c


[UNIXLAB@localhost ~]$ ./a.out p77.c


 Old mask = 2n


New MAsk = 32nn


The file mode creation mask now specifies:nn


  Group read permission UNMASKEDn


  Group write permission MASKEDn


  Group execute permission MASKEDn


 Old mask = 32n


New MAsk = 332nn


The file mode creation mask now specifies:nn


  User read permission UNMASKEDn


  User write permission MASKEDn


  User execute permission MASKEDn


 Old mask = 332n


New MAsk = 333nn


The file mode creation mask now specifies:nn


Other read permission UNMASKEDn


Other write permission MASKEDn


Other execute permission sMASKEDnss


Comments