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 ps commando als volgt: ps -e -opid,ppid. De uitvoer van die ps ziet er als volgt uit (maar dan langer):

PID PPID COMMAND
24497 24496 zsh
25337 24497 ps

De uitvoer van jou programma moet iets worden als:

Pid 0 has 2 children: 1 2
Pid 20555 has 1 child: 20571

Merk op: 1 kind, print dan child, meerdere kinderen print dan children. 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.

Tags: dutch, go

3 comments

Ik heb het voor elkaar in 57 regels: pastebin.com/brrVW3Mf

Lijkt te kloppen, kan vast nog korter ;)
Goed, nadat ik je blogpost wat beter had gelezen heb ik maar iets getypt wat wel doet wat je hier vraagt ;)

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 :)
Ziet er uit alsof die het doet en hij compileert. Heb wel nog een paar vragen. Je doet sommige dingen iig anders dan ik ze zou doen.

Ga zo ff een versie maken die de jouwe met de mijne merged.

Comments are closed

If you really, really want to comment, please mail miek@miek.nl.

0 comments in moderator queue