看板 DFBSD_submit 關於我們 聯絡資訊
Mmm. Well, I dunno about that. It might get a little to down into the guts of UNIX to be a stdio function. -Matt Matthew Dillon <dillon@backplane.com> :In that case, I propose adding an extension to obtain the pid of the :process on the other end of a popen()'ed stream; see attached patch. :This information is currently impossible to get at without rolling your :own custom popen/pclose functions (which I had to do in the installer.) : :-Chris : : :--Multipart=_Tue__27_Jul_2004_15_02_22_-0700_B+XZw10u8uQw0G5A :Content-Type: text/plain; : name="pgetpid.diff" :Content-Disposition: attachment; : filename="pgetpid.diff" :Content-Transfer-Encoding: 7bit : :Index: include/stdio.h :=================================================================== :RCS file: /home/dcvs/src/include/stdio.h,v :retrieving revision 1.5 :diff -u -r1.5 stdio.h :--- include/stdio.h 15 Nov 2003 19:28:42 -0000 1.5 :+++ include/stdio.h 26 Jul 2004 19:19:44 -0000 :@@ -49,6 +49,11 @@ : #include <machine/stdarg.h> : #endif : :+#ifndef _PID_T_DECLARED :+#define _PID_T_DECLARED :+typedef __pid_t pid_t; /* process id */ :+#endif :+ : #ifndef _SIZE_T_DECLARED : #define _SIZE_T_DECLARED : typedef __size_t size_t; :@@ -313,6 +318,7 @@ : __off_t ftello (FILE *); : int getw (FILE *); : int pclose (FILE *); :+pid_t pgetpid (FILE *); : FILE *popen (const char *, const char *); : int putw (int, FILE *); : void setbuffer (FILE *, char *, int); :Index: sys/sys/types.h :=================================================================== :RCS file: /home/dcvs/src/sys/sys/types.h,v :retrieving revision 1.6 :diff -u -r1.6 types.h :--- sys/sys/types.h 15 Nov 2003 19:28:42 -0000 1.6 :+++ sys/sys/types.h 26 Jul 2004 19:19:28 -0000 :@@ -82,7 +82,6 @@ : typedef __uint16_t mode_t; /* permissions */ : typedef __uint16_t nlink_t; /* link count */ : typedef __off_t off_t; /* file offset */ :-typedef __pid_t pid_t; /* process id */ : typedef quad_t rlim_t; /* resource limit */ : typedef __int32_t segsz_t; /* segment size */ : typedef __int32_t swblk_t; /* swap offset */ :@@ -131,6 +130,11 @@ : typedef __clockid_t clockid_t; : #endif : :+#ifndef _PID_T_DECLARED :+#define _PID_T_DECLARED :+typedef __pid_t pid_t; /* process id */ :+#endif :+ : #ifndef _SIZE_T_DECLARED : #define _SIZE_T_DECLARED : typedef __size_t size_t; :Index: lib/libc/gen/popen.3 :=================================================================== :RCS file: /home/dcvs/src/lib/libc/gen/popen.3,v :retrieving revision 1.2 :diff -u -r1.2 popen.3 :--- lib/libc/gen/popen.3 17 Jun 2003 04:26:42 -0000 1.2 :+++ lib/libc/gen/popen.3 27 Jul 2004 21:50:40 -0000 :@@ -33,12 +33,13 @@ : .\" $FreeBSD: src/lib/libc/gen/popen.3,v 1.10.2.4 2003/03/15 15:11:05 trhodes Exp $ : .\" $DragonFly: src/lib/libc/gen/popen.3,v 1.2 2003/06/17 04:26:42 dillon Exp $ : .\" :-.Dd May 3, 1995 :+.Dd Jul 27, 2004 : .Dt POPEN 3 : .Os : .Sh NAME : .Nm popen , :-.Nm pclose :+.Nm pclose , :+.Nm pgetpid : .Nd process : .Tn I/O : .Sh LIBRARY :@@ -49,6 +50,8 @@ : .Fn popen "const char *command" "const char *type" : .Ft int : .Fn pclose "FILE *stream" :+.Ft pid_t :+.Fn pgetpid "FILE *stream" : .Sh DESCRIPTION : The : .Fn popen :@@ -124,6 +127,12 @@ : and returns the exit status of the command : as returned by : .Fn wait4 . :+.Pp :+The :+.Fn pgetpid :+function returns the pid of the process on the other end of a stream that :+was opened with :+.Fn popen . : .Sh RETURN VALUES : The : .Fn popen :@@ -145,11 +154,20 @@ : .Dq popened : command, if : .Fa stream :-already :+has already been : .Dq pclosed , : or if : .Xr wait4 : returns an error. :+.Pp :+The :+.Fn pgetpid :+function returns (pid_t)\-1 if :+.Fa stream :+is not associated with a :+.Dq popened :+command or if it has already been :+.Dq pclosed . : .Sh ERRORS : The : .Fn popen :@@ -200,3 +218,7 @@ : .Pp : Bidirectional functionality was added in : .Fx 2.2.6 . :+The :+.Fn pgetpid :+function appeared in :+.Dx 1.1 . :Index: lib/libc/gen/popen.c :=================================================================== :RCS file: /home/dcvs/src/lib/libc/gen/popen.c,v :retrieving revision 1.3 :diff -u -r1.3 popen.c :--- lib/libc/gen/popen.c 6 Jun 2004 15:05:55 -0000 1.3 :+++ lib/libc/gen/popen.c 26 Jul 2004 19:03:19 -0000 :@@ -188,3 +188,14 @@ : : return (pid == -1 ? -1 : pstat); : } :+ :+pid_t :+pgetpid(FILE *iop) :+{ :+ struct pid *cur; :+ :+ for (cur = pidlist; cur != NULL; cur = cur->next) :+ if (cur->fp == iop) :+ return (cur->pid); :+ return (-1); :+}