summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2005-03-20 11:30:26 +0000
committerpjd <pjd@FreeBSD.org>2005-03-20 11:30:26 +0000
commita5414c9dd1d3b88cad7a5c25610d058b8fc1b06c (patch)
tree89e4ddeb24f9f952cdc70ea982fc692f5af99a3a
parentb616d49d9f0bc8d3516c123cc129f99d4a2e1cdf (diff)
downloadFreeBSD-src-a5414c9dd1d3b88cad7a5c25610d058b8fc1b06c.zip
FreeBSD-src-a5414c9dd1d3b88cad7a5c25610d058b8fc1b06c.tar.gz
- Introduce '-S' option which allows to match system processes (pgrep only).
- Rename IS_KERNPROC() macro to PSKIP() and extend its functionality. Now it'll skip calling process and system processes when -S is not given. As a side effect it fixes '-n' option. Before it was always matching calling process (because of missing 'if (kp->ki_pid == mypid)' check) and after that, calling process was ignored. - When '-l' option is given and there are no arguments, use p_comm as an arguments list (this is helpful for kernel threads matching). Reviewed by: gad MFC after: 3 days
-rw-r--r--usr.bin/pkill/pkill.14
-rw-r--r--usr.bin/pkill/pkill.c38
2 files changed, 21 insertions, 21 deletions
diff --git a/usr.bin/pkill/pkill.1 b/usr.bin/pkill/pkill.1
index b870458..7a272b2 100644
--- a/usr.bin/pkill/pkill.1
+++ b/usr.bin/pkill/pkill.1
@@ -44,7 +44,7 @@
.Nd find or signal processes by name
.Sh SYNOPSIS
.Nm pgrep
-.Op Fl filnvx
+.Op Fl Sfilnvx
.Op Fl F Ar pidfile
.Op Fl G Ar gid
.Op Fl M Ar core
@@ -105,6 +105,8 @@ which is the kernel image the system has booted from.
Restrict matches to processes with a parent process ID in the
comma-separated list
.Ar ppid .
+.It Fl S
+Search also in system processes (kernel threads).
.It Fl U Ar uid
Restrict matches to processes with a real user ID in the comma-separated
list
diff --git a/usr.bin/pkill/pkill.c b/usr.bin/pkill/pkill.c
index 07eb1a2..132de3e 100644
--- a/usr.bin/pkill/pkill.c
+++ b/usr.bin/pkill/pkill.c
@@ -72,8 +72,9 @@ __FBSDID("$FreeBSD$");
#define MIN_PID 5
#define MAX_PID 99999
-/* Check for system-processes which should always be ignored. */
-#define IS_KERNPROC(kp) ((kp)->ki_flag & P_KTHREAD)
+/* Ignore system-processes (if '-S' flag is not specified) and myself. */
+#define PSKIP(kp) ((kp)->ki_pid == mypid || \
+ (!kthreads && ((kp)->ki_flag & P_KTHREAD) != 0))
enum listtype {
LT_GENERIC,
@@ -102,6 +103,7 @@ int inverse;
int longfmt;
int matchargs;
int fullmatch;
+int kthreads;
int cflags = REG_EXTENDED;
kvm_t *kd;
pid_t mypid;
@@ -175,7 +177,7 @@ main(int argc, char **argv)
pidfromfile = -1;
execf = coref = _PATH_DEVNULL;
- while ((ch = getopt(argc, argv, "DF:G:M:N:P:U:d:fg:ij:lns:t:u:vx")) != -1)
+ while ((ch = getopt(argc, argv, "DF:G:M:N:P:SU:d:fg:ij:lns:t:u:vx")) != -1)
switch (ch) {
case 'D':
debug_opt++;
@@ -198,6 +200,11 @@ main(int argc, char **argv)
makelist(&ppidlist, LT_GENERIC, optarg);
criteria = 1;
break;
+ case 'S':
+ if (!pgrep)
+ usage();
+ kthreads = 1;
+ break;
case 'U':
makelist(&ruidlist, LT_USER, optarg);
criteria = 1;
@@ -295,17 +302,15 @@ main(int argc, char **argv)
}
for (i = 0, kp = plist; i < nproc; i++, kp++) {
- if (IS_KERNPROC(kp) != 0) {
+ if (PSKIP(kp)) {
if (debug_opt > 0)
fprintf(stderr, "* Skipped %5d %3d %s\n",
kp->ki_pid, kp->ki_uid, kp->ki_comm);
continue;
}
- if (matchargs) {
- if ((pargv = kvm_getargv(kd, kp, 0)) == NULL)
- continue;
-
+ if (matchargs &&
+ (pargv = kvm_getargv(kd, kp, 0)) != NULL) {
jsz = 0;
while (jsz < sizeof(buf) && *pargv != NULL) {
jsz += snprintf(buf + jsz,
@@ -314,7 +319,6 @@ main(int argc, char **argv)
pargv[0]);
pargv++;
}
-
mstr = buf;
} else
mstr = kp->ki_comm;
@@ -345,7 +349,7 @@ main(int argc, char **argv)
}
for (i = 0, kp = plist; i < nproc; i++, kp++) {
- if (IS_KERNPROC(kp) != 0)
+ if (PSKIP(kp))
continue;
if (pidfromfile >= 0 && kp->ki_pid != pidfromfile) {
@@ -457,17 +461,13 @@ main(int argc, char **argv)
* Take the appropriate action for each matched process, if any.
*/
for (i = 0, rv = 0, kp = plist; i < nproc; i++, kp++) {
- if (kp->ki_pid == mypid)
+ if (PSKIP(kp))
continue;
if (selected[i]) {
if (inverse)
continue;
} else if (!inverse)
continue;
-
- if (IS_KERNPROC(kp) != 0)
- continue;
-
rv = 1;
(*action)(kp);
}
@@ -481,7 +481,7 @@ usage(void)
const char *ustr;
if (pgrep)
- ustr = "[-filnvx] [-d delim]";
+ ustr = "[-Sfilnvx] [-d delim]";
else
ustr = "[-signal] [-finvx]";
@@ -507,10 +507,8 @@ grepact(struct kinfo_proc *kp)
{
char **argv;
- if (longfmt && matchargs) {
- if ((argv = kvm_getargv(kd, kp, 0)) == NULL)
- return;
-
+ if (longfmt && matchargs &&
+ (argv = kvm_getargv(kd, kp, 0)) != NULL) {
printf("%d ", (int)kp->ki_pid);
for (; *argv != NULL; argv++) {
printf("%s", *argv);
OpenPOWER on IntegriCloud