找回密码
 注册
关于网站域名变更的通知
查看: 338|回复: 1
打印 上一主题 下一主题

linux 进程 ID分析 fork getpid getppid 函数

[复制链接]
  • TA的每日心情
    开心
    2021-12-17 15:14
  • 签到天数: 31 天

    [LV.5]常住居民I

    跳转到指定楼层
    1#
    发表于 2020-10-8 22:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    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
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-25 00:19 , Processed in 0.156250 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表