rewrote xargs in C; implemented parallelization

This commit is contained in:
aiju 2011-08-27 11:19:54 +02:00
parent 98e3d4b1a5
commit 1ba43dd369
2 changed files with 72 additions and 23 deletions

View file

@ -1,23 +0,0 @@
#!/bin/rc
fn usage {
echo usage: $0 [-n num] program [arguments]
exit usage
}
rfork e
ifs='
'
nargs=1
while(~ $1 -*) {
switch($1) {
case -n
nargs=$2
shift 2
case *
echo bla
usage
}
}
while(x = `{read -n $nargs})
$* $x
if(! ~ $#x 0)
$* $x

72
sys/src/cmd/xargs.c Normal file
View file

@ -0,0 +1,72 @@
#include <u.h>
#include <libc.h>
#include <bio.h>
void
usage(void)
{
fprint(2, "usage: xargs [ -n lines ] [ -p procs ] args ...\n");
exits("usage");
}
void
dowait(void)
{
while(waitpid() != -1)
;
}
void
main(int argc, char **argv)
{
int lines, procs, i, j, run;
char **nargv, **args, **p;
static Biobuf bp;
lines = 10;
procs = 1;
ARGBEGIN {
case 'n': lines = atoi(EARGF(usage())); break;
case 'p': procs = atoi(EARGF(usage())); break;
default: usage();
} ARGEND;
if(argc < 1)
usage();
nargv = malloc(sizeof(char *) * (argc + lines + 1));
if(nargv == nil)
sysfatal("malloc: %r");
memcpy(nargv, argv, sizeof(char *) * argc);
args = nargv + argc;
if(Binit(&bp, 0, OREAD) < 0)
sysfatal("Binit: %r");
Blethal(&bp, nil);
atexit(dowait);
for(j = 0, run = 1; run; j++){
if(j >= procs)
waitpid();
memset(args, 0, sizeof(char *) * (lines + 1));
for(i = 0; i < lines; i++)
if((args[i] = Brdstr(&bp, '\n', 1)) == nil){
if(i == 0)
exits(nil);
run = 0;
break;
}
switch(fork()){
case -1:
sysfatal("fork: %r");
case 0:
exec(*nargv, nargv);
if(**nargv != '/' && strncmp(*nargv, "./", 2) != 0 &&
strncmp(*nargv, "../", 3) != 0){
*nargv = smprint("/bin/%s", *nargv);
exec(*nargv, nargv);
}
sysfatal("exec: %r");
}
for(p = args; *p; p++)
free(*p);
}
exits(nil);
}