This is pedigree.c in view mode; [Download] [Up]
/* pedigree: show process ancestry * Eric P. Scott, San Francisco State University, July 1993 * added -h switch -- Bruce Gingery bruce@TotSysSoft.com Wed Aug 4 03:17:30 MDT 1993 * * Compile on 2.x: * cc -o pedigree -s -object -O -bsd pedigree.c * Compile on 3.0: * cc -o pedigree -s -object -O -bsd -DNX_COMPILER_RELEASE_3_0 pedigree.c * Compile on 3.1: * cc -o pedigree -s -object -O2 -bsd -fno-builtin pedigree.c */ #include <stdio.h> #include <sys/errno.h> #ifdef __STRICT_BSD__ #include <strings.h> #else #include <string.h> #endif #include <sys/types.h> #include <sys/dir.h> #include <sys/stat.h> #ifndef NX_COMPILER_RELEASE_3_0 #include <sys/table.h> #else /* * Mach Operating System * Copyright (c) 1986 Carnegie-Mellon University * All rights reserved. The CMU software License Agreement specifies * the terms and conditions for use and redistribution. */ #define TBL_PROCINFO 10 /* index by proc table slot */ /* * TBL_PROCINFO data layout */ #define PI_COMLEN 19 /* length of command string */ struct tbl_procinfo { int pi_uid; /* user ID */ int pi_pid; /* proc ID */ int pi_ppid; /* parent proc ID */ int pi_pgrp; /* proc group ID */ int pi_ttyd; /* controlling terminal number */ int pi_status; /* process status: */ #define PI_EMPTY 0 /* no process */ #define PI_ACTIVE 1 /* active process */ #define PI_EXITING 2 /* exiting */ #define PI_ZOMBIE 3 /* zombie */ int pi_flag; /* other random flags */ char pi_comm[PI_COMLEN+1]; /* short command name */ }; #endif main(argc, argv) int argc; char *argv[]; { extern int errno; int chrdev(); register struct direct *d, **dp; register int i; int pid, n; struct tbl_procinfo pi; struct direct **df; dev_t lastd; char tty[4]; if (argc<1||argc>2) { (void)fprintf(stderr, "Usage: %s [pid]\n", *argv); exit(1); } if (argc==2) { if (!strcmp(argv[1],"-h")) { (void)fprintf(stderr, "Usage: %s [pid]\n", *argv); exit(1); } pid=atoi(argv[1]); if (kill(pid, 0)<0&&errno!=EPERM) { perror(argv[1]); exit(1); } } else pid=getpid(); if (chdir("/dev")<0) { perror("chdir"); exit(1); } if ((n=scandir(".", &df, chrdev, alphasort))<0) { (void)fputs("scandir() failed\n", stderr); exit(1); } lastd=(dev_t)-1; tty[0]='?', tty[1]='\0'; tty[2]='\0', tty[3]='\0'; (void)fputs(" UID PID PPID PGRP TT COMMAND\n", stdout); for (;;) { if (table(TBL_PROCINFO, pid, (char *)&pi, 1, sizeof pi)==1&&pi.pi_status==PI_ACTIVE) { if (pi.pi_ttyd!=lastd) { if (pi.pi_ttyd<0) tty[0]='?', tty[1]='\0'; else { dp=df; i=n; do { d= *dp++; if (*(dev_t *)&d->d_ino==(dev_t)pi.pi_ttyd) { if (d->d_namlen>3&&!strncmp(d->d_name, "tty", 3)) (void)strncpy(tty, d->d_name+3, 3); else { tty[0]=d->d_name[0], tty[1]=d->d_name[1]; tty[2]='\0'; } goto x; } } while (--i>0); tty[0]='?', tty[1]='?'; tty[2]='\0'; } x: lastd=pi.pi_ttyd; } (void)printf("%5d %5d %5d %5d %-3s%.*s\n", pi.pi_uid, pid, pi.pi_ppid, pi.pi_pgrp, tty, PI_COMLEN, pi.pi_comm); } else { (void)fputs("something went wrong\n", stderr); exit(1); } if (pid<=1) break; pid=pi.pi_ppid; } exit(0); } int chrdev(d) struct direct *d; { struct stat st; if (d->d_name[0]=='t'||(d->d_name[0]=='c'&&d->d_name[1]=='o')) { d->d_name[d->d_namlen]='\0'; if (stat(d->d_name, &st)>=0&&(st.st_mode&S_IFMT)==S_IFCHR) { *(dev_t *)&d->d_ino=st.st_rdev; return(1); } } return(0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.