Operating Systems 2021F: Assignment 1
Please submit the answers to the following questions via Brightspace by October 1, 2021. There are 20 points in 10 questions.
Submit your answers as a plain text file following this template. Name your answer file "<username>-comp3000-assign1.txt" (where username is your MyCarletonOne username).
Your answers will be parsed by a script in order to help with grading so please preserve the format of the template. No other formats will be accepted.
Don't forget to include what outside resources you used to complete each of your answers, including other students, man pages, and web resources. You do not need to list help from the instructor, TA, or information found in the textbook.
Questions
- [2] By default, what answers will give you a perfect score in 3000quiz? Why?
- [2] How is the second question in 3000quiz represented in assembly language? How does this compare to the string on line 57, in main()?
- [2] Where are the_questions, the_answers, and response (user input) stored: the stack, heap, or elsewhere? Can you verify this by looking at their relative addresses? Explain for each.
- [2] How can you remove the constant numQuestions and replace it with a runtime calculated count of the number of questions? Does anything in the answers data structure help with this calculation? Explain briefly.
- [2] How can you change 3000quiz so that if you run "./3000quiz Sally" the answer to question 4 is Sally? Only change the data passed to askQuestions(), don't change the code in askQuestions(). Can you do this without copying the string? Explain briefly.
- [2] How can you change 3000quiz so that if you set the environment variable DOGNAME to Anil's dog's name the answer to question 2 will be correct? (Again, just change the data passed to askQuestions(), not the code of askQuestions().) Can you do this without copying the string? Explain briefly.
- [2] Run 3000quiz using setarch -R: setarch -R ./3000quiz. How does this change the execution of 3000quiz? How can you tell?
- [2] Does adding environment variables change where things are stored in memory? How do you know?
- [2] Are there system calls (i.e., machine language instructions for making system calls) in the 3000quiz binary? How do you know? Why or why not?
- [2] How can you create a static binary of 3000quiz (i.e., one that loads no libraries at runtime)? Does this version have system calls in its binary? How do you know? Why or why not?
Code
3000quiz.c
/* 3000quiz.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
char * the_questions[] = {
"What is the capitol of Canada?",
"What is the name of Anil's dog?",
"How many feet in a mile?",
"What is your name?",
NULL
};
char * the_answers[] = {
"Ottawa",
"ENV: DOGNAME",
"5280",
"Bob",
NULL
};
int askQuestions(char **question, char *answer[],
char *argv[], char *envp[])
{
int score = 0;
int q = 0;
int c;
int res;
char response[100];
while (question[q] && answer[q]) {
printf("%s ", question[q]);
c = scanf("%100s", response);
if (c != EOF) {
if (strcmp(answer[q], response) == 0) {
printf("Correct!\n");
score++;
} else {
printf("Sorry, the answer is %s.\n", answer[q]);
}
}
q++;
}
return score;
}
int main(int argc, char *argv[], char *envp[])
{
int score;
int numQuestions = 4;
score = askQuestions(the_questions, the_answers, argv, envp);
printf("\nYour score is %d out of %d.\n", score, numQuestions);
return 0;
}