Operating Systems 2021F: Assignment 1: Difference between revisions
Line 19: | Line 19: | ||
# [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] 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? | # [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? | ||
# [2] Where are | # [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. | ||
==Code== | ==Code== |
Revision as of 19:11, 23 September 2021
This assignment is still being developed.
Please submit the answers to the following questions via Brightspace by October 1, 2021. There are 20 points in ?? questions.
Submit your answers as a plain text file following this template. 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] In what section of the 3000quiz binary are the questions stored? How did you get this information?
- [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?
- [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.
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;
}