[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