0% found this document useful (0 votes)
27 views3 pages

Os Ass-2

Set-A contains functions to tokenize a string and count the characters, words, and lines in a file. It uses strtok() to tokenize the input and open(), read(), close() to count characters in a file. Main prompts the user for input, tokenizes it, and calls count() if the command is "count" or uses fork() and execvp() to execute other commands. Set-B contains functions to list the files in a directory by name, number of entries, or inode number. Main prompts the user for input, tokenizes it, and calls listFiles() if the command is "list" or uses fork() to create a child process

Uploaded by

payalwani73
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)
27 views3 pages

Os Ass-2

Set-A contains functions to tokenize a string and count the characters, words, and lines in a file. It uses strtok() to tokenize the input and open(), read(), close() to count characters in a file. Main prompts the user for input, tokenizes it, and calls count() if the command is "count" or uses fork() and execvp() to execute other commands. Set-B contains functions to list the files in a directory by name, number of entries, or inode number. Main prompts the user for input, tokenizes it, and calls listFiles() if the command is "list" or uses fork() to create a child process

Uploaded by

payalwani73
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/ 3

Set-A

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

void make_toks(char *s, char *tok[])


{
int i=0;
char *p;

p = strtok(s," ");
while(p!=NULL)
{
tok[i++] = p;
p = strtok(NULL," ");
}

tok[i] = NULL;
}

void count(char *fn, char op)


{
int fh, cc=0 , wc =0, lc=0;
char c;
fh = open(fn,O_RDONLY);
if(fh == -1)
{
printf("File % is not found. \n", fn);
return ;
}

while(read(fh,&c,1)>0)
{
if(c==' ')
wc++;
else if(c == '\n')
{
wc++;
lc++;
}

cc++;
}

close(fh);

switch(op)
{
case 'c' :
printf("NO. of Character :%d\n", cc-1);
break;

case 'w' :
printf("No. of Words : %d\n", wc);
break;

case 'l' :
printf("No. of lines : %d\n", lc);
break;
}
}

int main()
{
char buff[80], *args[10];
int pid;

while(1)
{
printf("MYSHELL$");
fflush(stdin);
fgets(buff,80,stdin);
buff[strlen(buff)-1] = '\0';

make_toks(buff, args);

if(strcmp(args[0], "count")==0)
count(args[2], args[1][0]);
else
{
pid = fork();
if(pid>0)
wait();
else
{
if(execvp(args[0], args)== -1)
printf("Bad Command. \n");

}
}
}

return 0;
}

Set-B

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <dirent.h>
#include <sys/stat.h>

#define MAX_INPUT_LENGTH 1024


#define MAX_TOKENS 100

void tokenize(char *input, char **tokens, char *delimiter) {


// Tokenize the input string using the specified delimiter
char *token = strtok(input, delimiter);
int i = 0;
while (token != NULL) {
tokens[i++] = token;
token = strtok(NULL, delimiter);
}
tokens[i] = NULL; // Null-terminate the token array
}

void listFiles(char *dirname, char *option) {


DIR *dir;
struct dirent *entry;
struct stat file_stat;

dir = opendir(dirname);
if (dir == NULL) {
perror("opendir");
return;
}

while ((entry = readdir(dir)) != NULL) {


if (strcmp(option, "f") == 0) {
printf("%s\n", entry->d_name);
} else if (strcmp(option, "n") == 0) {
// Count entries
} else if (strcmp(option, "i") == 0) {
char full_path[MAX_INPUT_LENGTH];
snprintf(full_path, sizeof(full_path), "%s/%s", dirname, entry->d_name);

if (stat(full_path, &file_stat) == 0) {
printf("%s: inode=%lu\n", entry->d_name, (unsigned long)file_stat.st_ino);
} else {
perror("stat");
}
}
}

closedir(dir);
}

int main() {
char input[MAX_INPUT_LENGTH];
char *tokens[MAX_TOKENS];
const char *delimiter = " \t\n";
pid_t pid;

while (1) {
printf("myshell$ ");
if (fgets(input, sizeof(input), stdin) == NULL) {
perror("Failed to read input");
exit(EXIT_FAILURE);
}

// Tokenize the input command


tokenize(input, tokens, delimiter);

if (tokens[0] == NULL) {
continue; // Empty input, prompt again
}

if (strcmp(tokens[0], "q") == 0) {
exit(0);
} else if (strcmp(tokens[0], "list") == 0) {
if (tokens[1] != NULL && tokens[2] != NULL) {
listFiles(tokens[2], tokens[1]);
} else {
printf("Invalid 'list' command syntax\n");
}
} else {
// Create a child process to execute external commands
pid = fork();
if (pid < 0) {
perror("Fork failed");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// Child process
execvp(tokens[0], tokens);
perror("Execution failed");
exit(EXIT_FAILURE);
} else {
// Parent process
wait(NULL); // Wait for the child process to complete
}
}
}

return 0;
}

You might also like