0% found this document useful (0 votes)
24 views10 pages

SPL 6&7

The document discusses five tasks related to file I/O and process monitoring in C programming. Task 1 involves writing a program for parallel file copying using multiple processes. Task 2 implements the cat utility. Task 3 monitors multiple files using select. Task 4 uses fork twice to monitor a file. Task 5 writes a function to create a delay using select.

Uploaded by

21pwcse2000
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)
24 views10 pages

SPL 6&7

The document discusses five tasks related to file I/O and process monitoring in C programming. Task 1 involves writing a program for parallel file copying using multiple processes. Task 2 implements the cat utility. Task 3 monitors multiple files using select. Task 4 uses fork twice to monitor a file. Task 5 writes a function to create a delay using select.

Uploaded by

21pwcse2000
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/ 10

Lab Report No 6

System Programming
Submitted By:
MUHAMMAD UMAR JAN 21PWCSE2000
MUHAMMAD ZAID 21PWCSE1991
ABDUL MOIZ SOHAIL 21PWCSE2006
MUHSIN SHAH 21PWCSE1997
MUHAMMAD ILYAS 21PWCSE2055
MUHAMMAD SAAD 21PWCSE1997
Section:
B

“On my honor , as student of University of Engineering


and Technology, I have neither given nor received
unauthorized assistance on this academic work”

Task 01:Write a program for parallel file copying using multiple processes. (First check if the no of files
entered are even and if yes then create a child process for each pair and read from one and write to other.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include#includeTask 02: <<sys/types.hsys/wait.h>>

Code:int
#includeImplement cat utility. <fcntl.h> void copyFiles

sourceFile,(const destinationFile; char *source, const char *destination) {

char buffer[1024]; int


bytesRead;

sourceFile = open(source, O_RDONLY); if


(sourceFile == -1) {
perror("Error opening source file"); exit(EXIT_FAILURE);
}

destinationFile = open(destination, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR |


S_IWUSR | S_IRGRP | S_IROTH); if
(destinationFile == -1) {
perror("Error opening destination file");
close(sourceFile); exit(EXIT_FAILURE);
}

while ((bytesRead = read(sourceFile, buffer, sizeof(buffer))) > 0) { if


(write(destinationFile, buffer, bytesRead) != bytesRead) { perror("Error writing to
destination file"); close(sourceFile); close(destinationFile);
exit(EXIT_FAILURE);
}
}
int main(int argc, char *argv[]) { if (argc
% 2 != 1) {
fprintf(stderr, "Usage: %s source1 dest1 source2 dest2 ...", argv[0]); exit(EXIT_FAILURE);
} int numPairs = (argc - 1) / 2;

for (int i = 0; i < numPairs; i++) { pid_t pid =


fork();

if (pid == -1) {
perror("Error forking process");
exit(EXIT_FAILURE); } else if (pid == 0) {
copyFiles(argv[i * 2 + 1], argv[i * 2 + 2]); exit(EXIT_SUCCESS);
} }

for (int i = 0; i < numPairs; i++) { wait(NULL);


} printf("Parallel file copying completed!\n");

return 0;
}

Output:

Task 2: Implement cat utility in C programming language.


#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h> #include
<stdlib.h>

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


{
int fd1, fd2, rd, wr; char
buffer[100];
if (argc == 1)
{
fd1 = STDIN_FILENO; fd2 =
STDOUT_FILENO; rd = read(fd1,
buffer, 100); wr = write(fd2, buffer,
rd);
}
if (argc == 2)
{
fd1 = open(argv[1], O_RDONLY); fd2 =
STDOUT_FILENO;
for (;;)
{
rd = read(fd1, buffer, 100); if
(rd == 0) break;
wr = write(fd2, buffer, rd);
} }
if (argc == 3)
{
fd1 = STDIN_FILENO;
fd2 = open(argv[2], O_APPEND, S_IRWXU); rd =
read(fd1, buffer, 100); wr = write(fd2, buffer, rd);
}
if (argc == 4)
{
fd1 = open(argv[1], O_RDONLY); fd2 =
open(argv[2], O_APPEND, S_IRWXU); for (;;)
{
rd = read(fd1, buffer, 100); if
(rd == 0) break;
wr = write(fd2, buffer, rd);
} }
close(fd1);
close(fd2);
return 0;
}

Output:
Lab Report No 7

System Programming
Submitted By:
MUHAMMAD UMAR JAN 21PWCSE2000
MUHAMMAD ZAID 21PWCSE1991
ABDUL MOIZ SOHAIL 21PWCSE2006
MUHSIN SHAH 21PWCSE1997
MUHAMMAD ILYAS 21PWCSE2055
MUHAMMAD SAAD 21PWCSE1997
Section:
B

“On my honor , as student of University of Engineering


and Technology, I have neither given nor received
unauthorized assistance on this academic work”
Lab 07: Multiple File copying Task 01:
Write a program that copies 2 files sequentially.

Code:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#in clude <sys/stat.h>
#include <stdlib.h> #include
<errno.h>

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


{
int fd1 = open(argv[1], O_RDONLY), fd2 = open(argv[2], O_RDONLY); if(fd1==-1 || fd2==-1)
perror("Error: ");

char bff1[100], bff2[100]; int rd1 =


read(fd1, bff1, 100); int rd2 =
read(fd2, bff2, 100); if(rd1==-1 ||
rd2==-1)
perror("Error: ");

int wr1 = write(1, bff1, rd1), wr2 = write(1, bff2, rd2); if(wr1==-1
|| wr2==-1) perror("Error: ");

return 0;
}

Output:

Task 02:
Write a program that monitors 2 files using select.

Code:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h> #include
<sys/select.h>

int main()
{
int fd1 = open("f1.txt", O_RDONLY); int fd2 =
open("f2.txt", O_RDONLY); char buffer[100];

fd_set readset;
FD_ZERO(&readset);
FD_SET(fd1, &readset); FD_SET(fd2,
&readset); int maxfd = fd1 > fd2 ? fd1 :
fd2;
int nrfds = select(maxfd + 1, &readset, NULL, NULL, NULL); if
(FD_ISSET(fd1, &readset))
{
printf("f1.txt is ready!!\n");
}
if (FD_ISSET(fd2, &readset))
{
printf("f2.txt is ready!!\n");
}
return 0;
}
Output:

Task 03:
Write a program that monitors N files using Select.

Code:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h> #include
<sys/select.h>

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


{
int fds[argc - 1];
for (int i = 1; i <= argc - 1; i++)
{
fds[i - 1] = open(argv[i], O_RDONLY);
}
char buffer[100];

fd_set readset;
FD_ZERO(&readset);

int maxfd = 0;
for (int i = 0; i < argc - 1; i++)
{
FD_SET(fds[i], &readset);
if (maxfd < fds[i]) maxfd =
fds[i];
}

int nrfds = select(maxfd, &readset, NULL, NULL, NULL); for (int i =


0; i < argc - 1; i++)
{
if (FD_ISSET(fds[i], &readset))
{
printf("File No %d is ready.\n", i+1); }
}

return 0;
}
Output:

Task 04:
Write a program that monitors using fork () 2 times.
Code:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h> #include
<sys/select.h>

int main()
{
int fd1 = open("f1.txt", O_RDONLY); int
pid1 = fork(), pid2; if (pid1 > 0) pid2 =
fork();

char buffer[100];
if (pid1 == 0 || pid2 == 0)
{
fd_set readset;
FD_ZERO(&readset); FD_SET(fd1,
&readset);
int nrfds = select(fd1+1, &readset, NULL, NULL, NULL); if
(FD_ISSET(fd1, &readset))
{
int rd = read(fd1, buffer, 100); int wr
= write(1, buffer, rd);
}
}
return 0;
}
Output:

Task 05:
Write function that creates delay of N seconds using select function call.

Code:
#include <stdio.h>
#include <sys/select.h>
#include <sys/time.h>
#include <stdlib.h> #include
<signal.h>
void delay_using_select(int seconds)
{
struct timeval timeout; timeout.tv_sec =
seconds; timeout.tv_usec = 0;

fd_set empty_set; FD_ZERO(&empty_set);

select(0, &empty_set, NULL, NULL, &timeout);


}

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


{
int x = alarm(100);

delay_using_select(atoi(argv[1]));
printf("Delayed For %d seconds\n", atoi(argv[1])); int y =
alarm(2);
printf("%d", 100 - y);
}

Ouput:

__________________________________________________________________________________

You might also like