Problem 1
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void main(int argc, char* ARGV[3]){
int fd, i;
char buff[2];
fd = open("[Link]", O_RDONLY, 0777);
if(fd==-1){
printf("File open error\n");
}
else{
while((i=read(fd,buff,1))>0){
printf("%c", buff[0]);
}
close(fd);
}
Problem 2
#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);
}
Problem 3
#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];
sprintf(str,"ls –i %s %s \n",argv[1],argv[2]);
system(str);
return 0;
}
Problem 4
#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("[Link]"),F_GETFL,0);
if(val<0)
{
perror("fcntl error for fd");
exit(1);
}
accmode=val & O_ACCMODE;
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");
putchar('\n');
exit(0);
Problem 5
#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("[Link]",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);
}
#include<stdio.h>
#include<sys/types.h>
Problem 6
#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", "[Link]");
// exit(EXIT_FAILURE);
// }
if(stat("[Link]",&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);
}
Problem 7
#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("[Link]","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);
}
Problem 8
#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 = %o",(int)oldMask);
if(oldMask & S_IRGRP){
printf("\nChanging group read permission from Masked to unmasked.n");
oldMask=(oldMask ^ S_IRGRP);
}
newMask=(oldMask|S_IWGRP|S_IXGRP);
umask(newMask);
printf("\nNew MAsk = %o",(int)newMask);
printf("\nThe file mode creation mask now specifies:");
printf("\n Group read permission UNMASKED");
printf("\n Group write permission MASKED");
printf("\n Group execute permission MASKED");
oldMask=umask((mode_t)0);
printf("\n Old mask = %o",(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 = %o",(int)newMask);
printf("\nThe file mode creation mask now specifies:");
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 = %o",(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 = %o",(int)newMask);
printf("\nThe file mode creation mask now specifies:");
printf("\n Other read permission UNMASKED");
printf("\n Other write permission MASKED");
printf("\n Other execute permission MASKED");
}