Een leuke opdracht om je handen vuil te maken met programmeren in Go. De opdracht:
Schrijf een programma dat van alle processen op het systeem uitschrijft hoeveel kinderen elke ouder (parent) heeft. Gebruik het
pscommando als volgt:ps -e -opid,ppid. De uitvoer van diepsziet er als volgt uit (maar dan langer):
PID PPID COMMAND
24497 24496 zsh
25337 24497 psDe uitvoer van jou programma moet iets worden als:
Pid 0 has 2 children: 1 2
Pid 20555 has 1 child: 20571Merk op: 1 kind, print dan
child, meerdere kinderen print danchildren. De uitvoer van de parent PID (PPIDs) moet gesorteerd zijn, dus beginnend bij 0 en dan oplopend.
Om je op weg te helpen, hier een versie in de programmeertaal Perl (Als je Perl niet snapt, heb je nu een probleem):
#!/usr/bin/perl -l
use strict;
use warnings;
my (%child, $pid, $parent);
my @ps=`ps -e -opid,ppid,comm`; # Capture the ouput from `ps`
foreach (@ps[1..$#ps]) { # Discard the header line
($pid, $parent, undef) = split; # Split the line, discard 'comm'
push @{$child{$parent}}, $pid; # Save the child PIDs on a list
}
# Walk through the sorted PPIDs
foreach (sort { $a <=> $b } keys %child) {
print "Pid ", $_, " has ", @{$child{$_}}+0, " child", # Print them
@{$child{$_}} == 1 ? ": " : "ren: ", "@{$child{$_}}";
}
De versie in Go is iets langer (zo'n 80 regels). Ik zal deze morgen middag posten. In de tussen tijd mag je hier je tanden op stuk bijten.
3 comments
pastebin.com/LafC2BMu
Het is in 52 regels, ik gebruik een map[int]vector.IntVector{} om perl's %child na te doen later haal ik de keys van deze map op, push ze in een vector.Intvector zodat ik sort.Sort kan aanroepen, mogelijk kan dit slimmer :)
Het ps-commando voer ik uit met exec.Run, met als argumenten voor de fd's exec.PIPE, vervolgens stop ik de Stdout van het commando in een buffered reader (lang leve ReadString).
Verder wordt er wat ge-Atoi()-t en heb ik een ranzige constructie gebouwd om de vector.IntVector uit m'n child-map op te halen, aan te passen en terug te stoppen, dat kan vast ook anders :)
Ga zo ff een versie maken die de jouwe met de mijne merged.

