fork创建子进程后子进程为何执行了本该属于父进程的代码?
问题根因解释
你混淆了fork()的返回值和getpid()的返回值概念,核心错误点如下:
- 你认知中的"子进程的PID始终为0"是错误的:系统中PID为0的是内核idle进程,所有用户态进程的PID都为大于0的正整数,子进程也不例外。因此你写的判断条件
(int)getpid() == 0永远为假,父子进程都会进入else分支打印"I am parent" - 区分父子进程的正确判断依据是
fork()的返回值:fork()执行完成后,会给父进程返回新创建的子进程的PID(正整数),给子进程返回0,0是fork给子进程的返回标记,不是子进程自身的PID。
修正后的代码示例
pid_t child_Pid1 = fork(); if(child_Pid1 == 0) { // 只有子进程会进入该分支 printf("I am child\n"); } else if (child_Pid1 > 0) { // 只有父进程会进入该分支 printf("I am parent\n"); } else { // fork执行失败的异常处理 perror("fork failed"); }
内容的提问来源于stack exchange,提问作者ell
相关产品推荐
相关产品推荐

