TA的每日心情 | 开心 2021-12-17 15:14 |
|---|
签到天数: 31 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
代码如下) H, m; \& r& V+ o
#include <stdio.h>' R2 g( F/ j6 X. K9 ]+ D
2 #include <stdlib.h>
. V. q- T: ?3 D9 ?) O 3 #include <string.h>
w! W: C$ n: a' t" [- Y 4 #include <unistd.h>
2 E8 L$ z u9 z5 Q 5 #include <pthread.h>
. V/ G9 O2 f$ b4 N7 R5 X 6 #include <sys/stat.h>
9 c8 C; V4 G+ U 7 % J" }" T$ A; `3 b7 @8 T( d8 @
8 int main(int argc,char *argv[])
' C, Q! U2 B) @7 X* Z 9 {8 K7 _2 O, e2 _* F4 E+ o K( T
10 printf("before fork -1-\n");
* m3 W% B6 h6 q- Y2 R3 I% j 11 printf("before fork -2-\n");
U4 t; F5 T# } h0 Q 12 printf("before fork -3-\n");
" J+ ^) n& Z+ A: s; \ 13 printf("before fork -4-\n");
) D, I& [$ V/ C7 B 14 printf("before fork -5-\n");
3 i1 m& Y4 t+ @9 K 15
8 M3 ~, u* R* F1 y& v 16 pid_t pid = fork();& L" q+ w5 b' Y, r5 V* s
17 if(pid == -1){
4 J | ]. @9 `7 r: @" { 18 perror("fork error");
, ^% p1 n: j) A$ n% z* d. S5 q- d 19 exit(1);6 [) | C8 G9 K$ l) i& {; ]) O
20 }else if(pid == 0){& m; `; L% y+ P; O
21 printf("child was created\n");$ c d4 k2 P/ U* o) x
22 printf("child pid : %d;parent pid : %d\n",getpid(),getppid());
9 _. ~- G9 n; J2 V& }- [5 [ 23 }else if(pid > 0){' ?& D7 C, t) a& A
24 printf("I am parent process\n");
P+ \5 o6 ]# m' g8 {, Z0 V 25 printf("my child pid : %d from fork\n",pid);: `& y, v/ h: C7 o* h/ l3 j" w7 t
26 printf("current process pid : %d;parent parent pid : %d\n",getpid(),getppid());( z5 S( [3 t. b) }4 B
27 }
5 ?5 N" A N! X6 q# s9 Q 28
8 a' t( W+ d5 R1 m. ^% D& A 29 printf("===============end of file\n");
0 b3 u6 e9 r0 h7 N8 ]8 P2 o 30
P# y% c, _+ i% h* @' y3 y 31 return 0;' s8 Y+ Q g- {. o# H2 E1 N
32 }
`8 l/ v8 f g8 ~
, S% a( j2 {1 u( P+ l' e3 d4 e编译结果如下
3 ^; ?% N* N8 r( u, R6 f: Fhdh@ubuntu:~/work_linux/linux_c/4_test$ ./obj/fork
9 J4 H. H& W: Kbefore fork -1-3 z) z) W& e9 q& A4 O# p
before fork -2-
& A8 B& t! b2 f. ^* ^' k! \/ E0 dbefore fork -3-7 g6 U2 t, ?5 ]/ `$ i+ H; G& k
before fork -4-
2 k7 F) \- y S! F& J7 ubefore fork -5-
! H1 { k% I8 Z8 _I am parent process$ _' n7 e* N f# f5 B
my child pid : 65472 from fork; R7 P. b5 P1 ? `
current process pid : 65471;parent parent pid : 639010 `) V" g f" ~' v, P( |
===============end of file0 y. M" E! B# T0 ?
hdh@ubuntu:~/work_linux/linux_c/4_test$ child was created
7 R3 A, t6 X$ ^4 |# F, Achild pid : 65472;parent pid : 1617
: U0 ?/ t" c, t! _1 M% F7 {===============end of file4 b* h f7 Y# Q7 A" ~4 S+ z
( [- F' H2 t7 @4 m9 F) w2 t# n7 i9 w7 A1 T, K( |
问题点:# Q; ]* H' W6 N& E. p2 V, F
为什么子进程读到的父进程id与父进程读到自己ID不一致。能否解释一下 % s% s' G4 z7 j' [6 }
子进程打印出parent PID 1617 而父进程说自己PID时65471
. u; Z! S3 y' t/ [- h$ d |
|