[PATCH] jobs: Cache getpid
Herbert Xu <[email protected]> Sun, 24 Aug 2025 10:42:19 +0800
| Newsgroups | org.kernel.vger.dash |
|---|---|
| Message-ID | <[email protected]> |
As the vfork path now requires the use of getpid, cache the current PID in a new global variable mypid. Signed-off-by: Herbert Xu <[email protected]> diff --git a/src/jobs.c b/src/jobs.c index 83d9694..d2fb30b 100644 --- a/src/jobs.c +++ b/src/jobs.c @@ -872,6 +872,7 @@ static void forkchild(struct job *jp, union node *n, int mode) lvforked = vforked; if (!lvforked) { + mypid = 0; shlvl++; forkreset(mode == FORK_NOJOB ? n : NULL); @@ -887,7 +888,7 @@ static void forkchild(struct job *jp, union node *n, int mode) pid_t pgrp; if (jp->nprocs == 0) - pgrp = getpid(); + mypid = pgrp = getpid(); else pgrp = jp->ps[0].pid; /* This can fail because we are doing it in the parent also */ @@ -991,7 +992,9 @@ struct job *vforkexec(union node *n, char **argv, const char *path, int idx) jp = makejob(1); - vforked = getpid(); + if (!mypid) + mypid = getpid(); + vforked = mypid; pid = vfork(); diff --git a/src/main.c b/src/main.c index 1e192f8..dde9a36 100644 --- a/src/main.c +++ b/src/main.c @@ -64,6 +64,7 @@ #define PROFILE 0 int rootpid; +int mypid; int shlvl; #ifdef __GLIBC__ int *dash_errno; @@ -146,7 +147,7 @@ main(int argc, char **argv) opentrace(); trputs("Shell args: "); trargs(argv); #endif - rootpid = getpid(); + mypid = rootpid = getpid(); init(); setstackmark(&smark); login = procargs(argc, argv); diff --git a/src/main.h b/src/main.h index 19e4983..ef242a1 100644 --- a/src/main.h +++ b/src/main.h @@ -38,6 +38,8 @@ /* pid of main shell */ extern int rootpid; +/* pid of current shell */ +extern int mypid; /* shell level: 0 for the main shell, 1 for its children, and so on */ extern int shlvl; #define rootshell (!shlvl) -- Email: Herbert Xu <[email protected]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt