Lösningsförslag till tentamen
Systemprogrammering
18 mars 1994
Uppgift 1
Den var väl inte så svår?
Uppgift 2
Uppgift 3
int execute(char *command, char **args)
{
int pid, status;
/* Fork new process */
if ((pid = fork()) == 0) {
/* Child process */
/* Execute command */
if (execvp(command, args) == -1) {
exit(-1);
}
}
if (pid == -1)
return -1;
/* Wait for termination */
while (wait(&status) != pid)
;
/* Return exit status of child */
return (status & 0xff00) >> 8;
}
Uppgift 4
NEW INTERVIEW
Uppgift 5
#include
#include
#include
#include
char *progname = NULL, *command = NULL, *pattern = NULL;
int pflg = 0;
main(argc, argv)
int argc;
char **argv;
{
extern char *optarg;
extern int optind;
int c, errflg = 0;
char *optstr = "n:px:";
char *usagestr = "[-n namepat -p -x command] dir...";
progname = argv[0];
while ((c = getopt(argc, argv, optstr)) != -1)
switch (c) {
case `p':
pflg++; break;
case `n':
pattern = optarg; break;
case `x':
command = optarg; break;
case `?':
errflg++; break;
}
if (errflg) {
fprintf(stderr, "usage: %s %s", progname, usagestr);
exit (1);
}
if (optind == argc) /* No directory arguments, use . */
find(".");
/* Loop through all directories */
for (; optind < argc; optind++)
find(argv[optind]);
exit(0);
}
find(char *directory)
{
DIR *dirp;
struct dirent *dp;
char fullname[MAXPATHLEN], *argv[3];
if ((dirp = opendir(directory)) == NULL) {
perror(directory);
return;
}
while ((dp = readdir(dirp)) != NULL) {
/* Construct full name */
sprintf(fullname, "%s/%s", directory, dp->d_name);
/* Test if name matches optional pattern */
if (!pattern || regmatch(pattern, dp->d_name)) {
if (pflg)
printf("%s\n", fullname);
if (command) {
argv[0] = command;
argv[1] = fullname;
argv[2] = 0;
if (execute(command, argv) == -1)
perror(command);
}
}
/* Test if directory */
if (IsDirectory(fullname, dp->d_name))
find(fullname);
}
closedir (dirp);
return;
}
int IsDirectory(char *fullname, char *shortname)
{
struct stat statbuf;
/* Get information about file */
if (stat(fullname, &statbuf) == -1) {
perror(fullname);
return 0;
}
/* Test if directory and not . or .. */
return S_ISDIR(statbuf.st_mode) && strcmp(shortname, ".")
&& strcmp(shortname, "..")
}
Uppgift 6
Här gick det bra med nästan vad som helst.
Uppgift 7
· Datastruktur, data åtkoms endast via monitorfunktioner 2
· En process i taget exekverar i monitorn 1
· Synkronisering med konditionsvariabler 1
Uppgift 8
· Rendezvous. Dubbelriktad, synkron meddelandeöverföring.
· Sändaren initierar kommunikation. Talar om att han vill kommunicera med en mottagare.
Specificerar ett meddelande
· Mottagaren talar om att han vill vara med på kommunikationen och får meddelandet från
sändaren.
· Mottagaren får tid på sig att beräkna ett svarsmeddelande som han så småningom skickar
tillbaks till sändaren.
· Sändaren har varit blockerad hela tiden, med får nu svar på sin förfrågan.