diff options
Diffstat (limited to 'sys/src/cmd/cwfs/proc.c')
-rw-r--r-- | sys/src/cmd/cwfs/proc.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/sys/src/cmd/cwfs/proc.c b/sys/src/cmd/cwfs/proc.c new file mode 100644 index 000000000..22ac02e60 --- /dev/null +++ b/sys/src/cmd/cwfs/proc.c @@ -0,0 +1,41 @@ +#include "all.h" +#include "io.h" + +/* + * based on libthread's threadsetname, but drags in less library code. + * actually just sets the arguments displayed. + */ +void +procsetname(char *fmt, ...) +{ + int fd; + char *cmdname; + char buf[128]; + va_list arg; + + va_start(arg, fmt); + cmdname = vsmprint(fmt, arg); + va_end(arg); + if (cmdname == nil) + return; + snprint(buf, sizeof buf, "#p/%d/args", getpid()); + if((fd = open(buf, OWRITE)) >= 0){ + write(fd, cmdname, strlen(cmdname)+1); + close(fd); + } + free(cmdname); +} + +void +newproc(void (*f)(void *), void *arg, char *text) +{ + int kid = rfork(RFPROC|RFMEM|RFNOWAIT); + + if (kid < 0) + sysfatal("can't fork: %r"); + if (kid == 0) { + procsetname("%s", text); + (*f)(arg); + exits("child returned"); + } +} |