-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathpart2test.cpp
More file actions
137 lines (132 loc) · 5.16 KB
/
part2test.cpp
File metadata and controls
137 lines (132 loc) · 5.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/**
* CS 3013 Project 2
* Arthur Lockman and Tucker Haydon
* part2test.cpp
*
* This code tests the insertion of the system call in part 2 of the project.
* To do this, it prints the stats of the main process after forking
* twice, and then has each child print out stats as well. This shows that
* all of the functionality is working as intended.
*/
#include <sys/syscall.h>
#include <iostream>
#include <iomanip>
#include "processinfo_usr.h"
#include <stdlib.h>
#include <sys/wait.h>
using namespace std;
#define __NR_cs3013_syscall2 356
/**
* Print a stat returned from the syscall.
**/
void printStat(char const *stat, long long val)
{
cout << left << setw(20) << stat << right << setw(20) << val << endl;
}
int main()
{
int pid1, pid2;
if ((pid1 = fork()) < 0)
{
cerr << "Fork failed!" << endl;
}
else if (pid1 == 0) //is child
{
sleep(3);
cout << "I am a child process. I slept for 3 second." << endl;
struct processinfo info;
long retVal = (long) syscall(__NR_cs3013_syscall2, &info);
cout << "Got a return value from syscall: " << retVal << endl;
if (retVal == 0)
{
printStat("State:", info.state);
printStat("PID:", info.pid);
printStat("Parent PID:", info.parent_pid);
printStat("Youngest Child:", info.youngest_child);
printStat("Younger Sibling:", info.younger_sibling);
printStat("Older Sibling:", info.older_sibling);
printStat("UID:", info.uid);
printStat("Start Time:", info.start_time);
printStat("User Time:", info.user_time);
printStat("System Time:", info.sys_time);
printStat("Child User Time:", info.cutime);
printStat("Child Sys Time:", info.cstime);
}
exit(0);
}
else //is parent
{
if ((pid2 = fork()) < 0)
{
cerr << "Fork failed!" << endl;
}
else if (pid2 == 0) //is child
{
sleep(2);
cout << "I am a child process. I slept for 2 second." << endl;
struct processinfo info;
long retVal = (long) syscall(__NR_cs3013_syscall2, &info);
cout << "Got a return value from syscall: " << retVal << endl;
if (retVal == 0)
{
printStat("State:", info.state);
printStat("PID:", info.pid);
printStat("Parent PID:", info.parent_pid);
printStat("Youngest Child:", info.youngest_child);
printStat("Younger Sibling:", info.younger_sibling);
printStat("Older Sibling:", info.older_sibling);
printStat("UID:", info.uid);
printStat("Start Time:", info.start_time);
printStat("User Time:", info.user_time);
printStat("System Time:", info.sys_time);
printStat("Child User Time:", info.cutime);
printStat("Child Sys Time:", info.cstime);
}
exit(0);
} else
{
cout << "I am a parent process. I am printing stats before my children wake up." << endl;
struct processinfo info;
long retVal = (long) syscall(__NR_cs3013_syscall2, &info);
cout << "Got a return value from syscall: " << retVal << endl;
if (retVal == 0)
{
printStat("State:", info.state);
printStat("PID:", info.pid);
printStat("Parent PID:", info.parent_pid);
printStat("Youngest Child:", info.youngest_child);
printStat("Younger Sibling:", info.younger_sibling);
printStat("Older Sibling:", info.older_sibling);
printStat("UID:", info.uid);
printStat("Start Time:", info.start_time);
printStat("User Time:", info.user_time);
printStat("System Time:", info.sys_time);
printStat("Child User Time:", info.cutime);
printStat("Child Sys Time:", info.cstime);
}
int status;
waitpid(pid1, &status, 0);
waitpid(pid2, &status, 0);
cout << "I am a parent process. I am printing stats after my child has woken." << endl;
retVal = (long) syscall(__NR_cs3013_syscall2, &info);
cout << "Got a return value from syscall: " << retVal << endl;
if (retVal == 0)
{
printStat("State:", info.state);
printStat("PID:", info.pid);
printStat("Parent PID:", info.parent_pid);
printStat("Youngest Child:", info.youngest_child);
printStat("Younger Sibling:", info.younger_sibling);
printStat("Older Sibling:", info.older_sibling);
printStat("UID:", info.uid);
printStat("Start Time:", info.start_time);
printStat("User Time:", info.user_time);
printStat("System Time:", info.sys_time);
printStat("Child User Time:", info.cutime);
printStat("Child Sys Time:", info.cstime);
}
exit(0);
}
}
return 0;
}