CS 476/576 Systems Programming Fall 2012 Final Exam Time 2 & 1/2 hours Open Book & Notes Name: Unix Login: Question 1: 15 points Consider the following program: Q1.c int main(int argc, char **argv) { int n, in; char buf[1024]; system ("rm Q1File"); system ("echo Q1File > Q1File"); in = open("Q1File", O_RDONLY) ; close(0); dup(3); n = read(0, buf, sizeof(buf)); write(1, buf, n); write(2, buf, n); } What is the output of the following? % Q1 2 Question 2: 15 points Consider the following program: Q2.c int main(void) { int i; for (i = 1; i < 50; i++) { signal(i, handler) ; sleep(1); kill(getpid(), i); } } void handler(int sig) { psignal(sig); } % kill –l HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM USR1 USR2 CLD PWR WINCH URG POLL STOP TSTP CONT TTIN TTOU VTALRM PROF XCPU XFSZ WAITING LWP FREEZE THAW CANCEL LOST RTMIN RTMIN+1 RTMIN+2 RTMIN+3 RTMAX-3 RTMAX-2 RTMAX-1 RTMAX What is the output of the following? % Q2 3 Question 3: 20 points Consider the following program: Q3.c int main() { int pip[2]; FILE *fp0; FILE *fp1; char buffer[100]; pipe(pip); fp0 = fdopen(3, "r"); fp1 = fdopen(4, "w"); fprintf(fp1, "%s", "HI"); fclose(fp1); fscanf(fp0, "%s\n", buffer); fprintf(stdout, buffer); fprintf(stderr, buffer); printf("\n"); } What is the output of the following? % Q3 4 Question 4: 20 points The following java program creates a swing interface for 10 counting threads and two bottoms: start and suspend. Modify the program to add a third button to resume all threads counting. Show your modifications in the provided spaces: Q4.java // <applet code=Q4 width=200 height=250></applet> public class Q4 extends JApplet { private CounterThread[] s; private JButton startB = new JButton("Start"); private JButton suspendB = new JButton("Suspend"); class CounterThread extends Thread { private JTextField t = new JTextField(10); private int count = 0; public CounterThread() { JPanel p = new JPanel(); p.add(t); getContentPane().add(p); } public synchronized void funInterrupt() { interrupt(); } public void run() { while (true) { t.setText(Integer.toString(count++)); synchronized (this) { try { sleep(500); } catch(InterruptedException e) { try{ wait(); } catch(InterruptedException x) { } } } } } } 5 class StartL implements ActionListener { public void actionPerformed(ActionEvent e) { startB.setBackground(Color.red); startB.setEnabled(false); for (int i = 0; i < s.length; i++) s[i].start(); suspendB.setBackground(Color.green); suspendB.setEnabled(true); } } class SuspendL implements ActionListener { public void actionPerformed(ActionEvent e) { suspendB.setBackground(Color.red); suspendB.setEnabled(false); for (int i = 0; i < s.length; i++) s[i].funInterrupt(); } } public void init() { Container cp = getContentPane(); cp.setLayout(new FlowLayout()); s = new CounterThread[10]; for (int i = 0; i < s.length; i++) s[i] = new CounterThread(); startB.addActionListener(new StartL()); startB.setBackground(Color.green); startB.setEnabled(true); cp.add(startB); suspendB.addActionListener(new SuspendL()); suspendB.setBackground(Color.red); suspendB.setEnabled(false); cp.add(suspendB); } public static void main(String[] args) { Q4 applet = new Q4(); Console.run(applet, 200, 500); } } 6 Question 5: 30 points In the following the child sends the date to the parent via a pipe. Rewrite this program either in C or Java so that the two entities (processes or threads) communicate via a tcp socket instead of pipe. main() { int pid, pfd[2]; char line[100]; pipe(pfd); pid = fork(); if (pid == 0) { close(pfd[0]); dup2(pfd[1], 1); close(pfd[1]); execl("/bin/date", "date", 0); } else { close(pfd[1]); read (pfd[0], line, sizeof(line)); printf("date from child is: %s\n", line); close(pfd[0]); waitpid(NULL); } } 7 8