0% found this document useful (0 votes)
20 views

Problem 1

The document contains code snippets for 8 problems related to file I/O and permissions in C programming. Problem 1 opens and reads a file. Problem 2 copies the contents of one file to another. Problem 3 creates a hard link between two files. Problem 4 determines the access mode of an open file. Problem 5 duplicates a file descriptor. Problem 6 prints file attributes using stat. Problem 7 reads and prints the last few lines of a file. Problem 8 demonstrates changing umask permissions.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
20 views

Problem 1

The document contains code snippets for 8 problems related to file I/O and permissions in C programming. Problem 1 opens and reads a file. Problem 2 copies the contents of one file to another. Problem 3 creates a hard link between two files. Problem 4 determines the access mode of an open file. Problem 5 duplicates a file descriptor. Problem 6 prints file attributes using stat. Problem 7 reads and prints the last few lines of a file. Problem 8 demonstrates changing umask permissions.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 7

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("hello.txt", 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("somefile.txt"),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("file.txt",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", "file.txt");
// exit(EXIT_FAILURE);
// }
if(stat("file.txt",&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("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);
}

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

You might also like