server PID = 308, uniquifier = 18, DOOR_UNREF
solaris % doorinfo /etc/.syslog_door
server PID = 282, uniquifier = 1635
solaris % ps βf -p 308
root 308 1 0 Apr 01 ? 0:34 /usr/sbin/nscd
solaris % ps βf -p 282
root 282 1 0 Apr 01 ? 0:10 /usr/sbin/syslogd βn βz 14
ΠΠΎΠΌΠ°Π½Π΄Ρ ps ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ, ΠΊΠ°ΠΊΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΌ door_info.
ΠΡΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ°Π»
ΠΠΎΠ³Π΄Π° ΠΌΡ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π»ΠΈ ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ door_call, ΠΌΡ ΠΎΡΠΌΠ΅ΡΠΈΠ»ΠΈ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π±ΡΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ°Π», Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π²Π΅ΡΠ΅ΠΉ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ°. Π‘Π΅ΠΉΡΠ°Ρ ΠΌΡ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΡΡΠΎ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 15.4 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ-ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΡ Π²Π΅ΡΡΠΈΡ Π»ΠΈΡΡΠΈΠ½Π³Π° 15.2.
ΠΠΈΡΡΠΈΠ½Π³ 15.4. ΠΡΠ²ΠΎΠ΄ Π°Π΄ΡΠ΅ΡΠ° ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°//doors/client2.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 int fd;
6 long ival, oval;
7 door_arg_t arg;
8 if (argc != 3)
9 err_quit("usage: client2 <server-pathname> <integer-value>");
10 fd = Open(argv[1], O_RDWR); /* ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ Π΄Π²Π΅ΡΡ */
11 /* ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ */
12 ival = atol(argv[2]);
13 arg.data_ptr = (char *) &ival; /* Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ-Π΄Π°Π½Π½ΡΠ΅ */
14 arg.data_size = sizeof(long); /* ΠΎΠ±ΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ */
15 arg.desc_ptr = NULL;
16 arg.desc_num = 0;
17 arg.rbuf = (char *) &oval; /* Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ */
18 arg.rsize = sizeof(long); /* ΠΎΠ±ΡΠ΅ΠΌ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ Π΄Π°Π½Π½ΡΡ */
19 /* Π²ΡΠ·ΠΎΠ² ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ Π²ΡΠ²ΠΎΠ΄ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° */
20 Door_call(fd, &arg);
21 printf("&oval = %p, data_ptr = %p, rbuf = %p, rsize = %d\n",
22 &oval, arg.data_ptr, arg.rbuf, arg.rsize);
23 printf("result: %ld\n", *((long *) arg.data_ptr));
24 exit(0);
25 }
19-22 Π ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° ΡΠΊΡΠ°Π½ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ Π°Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ oval, ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ data_ptr, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ door_call Π΄Π°Π½Π½ΡΠ΅, ΠΈ Π°Π΄ΡΠ΅Ρ ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ° (rbuf ΠΈ rsize).
ΠΠ°ΠΏΡΡΡΠΈΠΌ ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ° ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠΌ 15.2. ΠΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, ΡΡΠΎ data_ptr ΠΈ rbuf Π±ΡΠ΄ΡΡ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ oval ΠΈ rsize Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 4 (4 Π±Π°ΠΉΡΠ° Π² Π±ΡΡΠ΅ΡΠ΅). Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, Π²ΠΎΡ ΡΡΠΎ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ:
solaris % client2 /tmp/server2 22
&oval = effff740, data_ptr = effff740, rbuf = effff740, rsize = 4
result: 484
ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ ΡΡΡΠΎΠΊΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 15.4, ΡΠΌΠ΅Π½ΡΡΠΈΠ² ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ°. ΠΠΎΠ²ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΡΡΠΎΠΊΠΈ 18 Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΈΠ΄:
arg.rsize = sizeof(long) β 1; /* ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ° Π΄Π°Π½Π½ΡΡ */
ΠΠ°ΠΏΡΡΡΠΈΠΌ Π½ΠΎΠ²ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΄Π΅Π»ΠΈΠ»Π° ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ΄ Π½ΠΎΠ²ΡΠΉ Π±ΡΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΠΈ data_ptr ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° Π½ΠΎΠ²ΡΠΉ Π±ΡΡΠ΅Ρ:
solaris % client3 /tmp/server3 33
&oval = effff740, data_ptr = ef620000, rbuf = ef620000, rsize = 4096
result: 1089
Π Π°Π·ΠΌΠ΅Ρ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ° ΡΠ°Π²Π΅Π½ 4096 Π±Π°ΠΉΡ, ΡΡΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ ΡΡΡΠ°Π½ΠΈΡΡ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠ·Π½Π°Π»ΠΈ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 12.6. ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠ΅Π³Π΄Π° ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌ ΡΠ΅ΡΠ΅Π· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ data_ptr, Π° Π½Π΅ ΡΠ΅ΡΠ΅Π· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, Π°Π΄ΡΠ΅ΡΠ° ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Ρ Π² rbuf. Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠΈΠΏΠ° Β«Π΄Π»ΠΈΠ½Π½ΠΎΠ΅ ΡΠ΅Π»ΠΎΠ΅Β» ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊΠ°ΠΊ *(long*)arg.data_ptr, Π° Π½Π΅ oval (ΡΡΠΎ ΠΌΡ Π΄Π΅Π»Π°Π»ΠΈ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 15.2).
ΠΠΎΠ²ΡΠΉ Π±ΡΡΠ΅Ρ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ mmap ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ ΡΠΈΡΡΠ΅ΠΌΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ munmap. ΠΠ»ΠΈΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ Π±ΡΡΠ΅Ρ ΠΏΡΠΈ Π½ΠΎΠ²ΡΡ Π²ΡΠ·ΠΎΠ²Π°Ρ door_call.
Π€ΡΠ½ΠΊΡΠΈΡ door_cred ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅
ΠΠ° ΡΡΠΎΡ ΡΠ°Π· ΠΌΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π½Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ servproc ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 15.3, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π² Π½Π΅Π΅ Π²ΡΠ·ΠΎΠ² door_cred Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 15.5 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°; ΡΡΠ½ΠΊΡΠΈΠΈ main ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π΅ ΠΏΡΠ΅ΡΠ΅ΡΠΏΠ΅Π²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Π»ΠΈΡΡΠΈΠ½Π³Π°ΠΌΠΈ 15.2 ΠΈ 15.3.
ΠΠΈΡΡΠΈΠ½Π³ 15.5. ΠΡΠΎΡΠ΅Π΄ΡΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΏΠΎΠ»ΡΡΠ°ΡΡΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅//doors/server4.c
1 #include "unpipc.h"
2 void
3 servproc(void *cookie, char *dataptr, size_t datasize,
4 door_desc_t *descptr, size_t ndesc)
5 {
6 long arg, result;
7 door_cred_t info;
8 /* ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΡΠ²ΠΎΠ΄ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅ */
9 Door_cred(&info);
10 printf("euid = %ld, ruid = %ld, pid = %ld\n",
11 (long) info.dc_euid, (long) info.dc_ruid, (long) info.dc_pid);
12 arg = *((long *) dataptr);
13 result = arg * arg;
14 Door_return((char *) &result, sizeof(result), NULL, 0);
15 }
Π‘Π½Π°ΡΠ°Π»Π° ΠΌΡ Π·Π°ΠΏΡΡΡΠΈΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ-ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΠΉ ΠΈ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ, ΠΊΠ°ΠΊ ΠΌΡ ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΈ. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΡΠΌΠ΅Π½ΠΈΠΌ Π²Π»Π°Π΄Π΅Π»ΡΡΠ° ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π½Π° ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π±ΠΈΡ SUID ΠΈ Π·Π°ΠΏΡΡΡΠΈΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ½ΠΎΠ²Π°:
solaris % client4 /tmp/server4 77 ΠΏΠ΅ΡΠ²ΡΠΉ Π·Π°ΠΏΡΡΠΊ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
result: 5929
solaris % su Π²Ρ ΠΎΠ΄ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
Password:
Sun Microsystems Inc. Sun OS 5.6 Generic August 1997
solaris # cd ΠΊΠ°ΡΠ°Π»ΠΎΠ³, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ»
solaris # ls βl client4
-rwxrwxr-x 1 rstevens other1 139328 Apr 13 06:02 client4
solaris # chown root client4 ΡΠΌΠ΅Π½Π° Π²Π»Π°Π΄Π΅Π»ΡΡΠ° Π½Π° ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
solaris # chmod u+s client4 Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π±ΠΈΡΠ° SUID
solaris # ls -l client4 ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ ΠΈ Π²Π»Π°Π΄Π΅Π»ΡΡΠ° ΡΠ°ΠΉΠ»Π°
-rwsrwxr-x 1 root other1 139328 Apr 13 06:02 client4
solaris # exit
solaris % ls -l client4
-rwsrwxr-x 1 root other1 139328 Apr 13 06:02 client4
solaris % client4 /tmp/server477 ΠΈ Π΅ΡΠ΅ ΡΠ°Π· Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ-ΠΊΠ»ΠΈΠ΅Π½Ρ
result: 5929
ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ Π² ΡΡΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠ²ΠΎΠ΄ΠΈΠ» ΡΠ΅ΡΠ²Π΅Ρ, ΡΠΎ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠ°ΡΡΠΈΠ½Ρ:
solaris % server4 /tmp/server4
euid = 224, ruid = 224, pid = 3168
euid = 0, ruid = 224, pid = 3176
ΠΠ΅ΠΉΡΡΠ²ΡΡΡΠΈΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠΈ Π²ΡΠΎΡΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ 0 ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°
Π§ΡΠΎΠ±Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΊΠ°ΠΊ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²ΡΠ΄Π°ΡΠΈ Π΅Π΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΏΠΎΡΠΎΠΊΠ°. ΠΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π΅Π΅ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΡΠΈΡΠ΅ΠΊΡΠ½Π΄Π½ΡΡ ΠΏΠ°ΡΠ·Ρ, ΡΡΠΎΠ±Ρ ΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠΠ° ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡΡΡΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ². Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 15.6 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΠΈΡΡΠΈΠ½Π³ 15.6. ΠΡΠΎΡΠ΅Π΄ΡΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°, Π²ΡΠ²ΠΎΠ΄ΡΡΠ°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΡΠΎΠΊΠ°//doors/server5.c
1 #include "unpipc.h"
2 void
3 servproc(void *cookie, char *dataptr, size_t datasize,
4 door_desc_t *descptr, size_t ndesc)
5 {
6 long arg, result;
7 arg = *((long *) dataptr);
8 printf("thread id %ld, arg = %ld\n", pr_thread_id(NULL), arg);
9 sleep(5);
10 result = arg * arg;
11 Door_return((char*)&result, sizeof(result), NULL, 0);
12 }
ΠΠ΄Π΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½ΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· Π½Π°ΡΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ β pr_thread_id. ΠΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ (ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠ»ΠΈ Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π²ΠΌΠ΅ΡΡΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π²ΡΠ·Π²Π°Π²ΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°) ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° (ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, Π½ΠΎ Π²ΡΠ΅Π³Π΄Π° Π² ΡΠΎΡΠΌΠ°ΡΠ΅ Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅Π»ΠΎΠ³ΠΎ). ΠΡΠΎΡΠ΅ΡΡΡ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ β Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ. Π₯ΠΎΡΡ ΠΌΡ ΠΈ Π½Π΅ Π·Π½Π°Π΅ΠΌ, ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡ ΡΠΈΠΏΡ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° (int ΠΈΠ»ΠΈ long), ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ getpid, ΠΊ ΡΠΈΠΏΡ long ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (Π»ΠΈΡΡΠΈΠ½Π³ 9.2). ΠΠ΄Π½Π°ΠΊΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΊ ΡΠΈΠΏΡ pthread_t, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ΅Π»ΡΡ ΡΠΈΠΏΠΎΠ². Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, Π² Solaris 2.6 ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°ΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΠ²Π»ΡΡΡΡΡ ΠΊΠΎΡΠΎΡΠΊΠΈΠ΅ ΡΠ΅Π»ΡΠ΅, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² Digital Unix ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ°ΡΡΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ ΡΠ΅Π»ΡΠ΅ ΡΠΈΡΠ»Π° Π΄Π»Ρ Π·Π°Π΄Π°Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ (ΠΊΠ°ΠΊ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅). ΠΠ°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΡΠ΅ΠΊΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 15.7, ΡΠ΅ΡΠ°Π΅Ρ ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ.
ΠΠΈΡΡΠΈΠ½Π³ 15.7. Π€ΡΠ½ΠΊΡΠΈΡ pr_thread_id: Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΡΠΎΠΊΠ°//lib/wrappthread.c
245 long
246 pr_thread_id(pthread_t *ptr)
247 {
248 #if defined(sun)
249 return((ptr == NULL) ? pthread_self() : *ptr); /* Solaris */
250 #elif defined(__osf__) && defined(__alpha)
251 pthread_t tid;
252 tid = (ptr == NULL) ? pthread_self() : *ptr; /* Digital Unix */
253 return(pthread_getsequence_np(tid));
254 #else
255 /* ΠΏΡΠΎΡΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ */
256 return((ptr == NULL) ? pthread_self() : *ptr);
257 #endif
258 }
ΠΡΠ»ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΡΠΎΠΊΠ° Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌ ΡΠ΅Π»ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ, ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ»ΠΎΠΆΠ½Π΅Π΅. ΠΠ½Π° ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠΈΠΏΠ° pthread_t Π² ΡΠ΅Π»ΡΠ΅ ΡΠΈΡΠ»Π° ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΡΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ ΠΈΠ»ΠΈ ΡΠ²ΡΠ·Π½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅. ΠΡΠ° Π·Π°Π΄Π°ΡΠ° ΡΠ΅ΡΠ΅Π½Π° Π² ΡΡΠ½ΠΊΡΠΈΠΈ thread_name Π² ΠΊΠ½ΠΈΠ³Π΅ [13].