Linux笔记--进程初识

有这样一段代码,分别在父进程和子进程中返回fork()的返回值,以及当前进程pid和父进程pid

#include 
#include 
#include 
#include 
int t;
pid_t pid;

void print(){

	printf("Hello\n");

	exit(0);
}

int main(){

	pid = fork();
	if(pid > 0){
	
		printf("father pid is %d\n",pid);
		printf("getpid is %d\n",getpid());
		printf("getppid is %d\n",getppid());
	}
	else if(pid ==0){
		
		printf("child pid is %d\n",pid);
		printf("getpid is %d\n",getpid());
		printf("getppid is %d\n",getppid());
	}
	else{
	
		perror("fork");
		exit(1);
	}
	return 0;
}

打印出来的信息为

father pid is 3081
getpid is 3080
getppid is 2790
child pid is 0
getpid is 3081
getppid is 1

fork()在创建完子进程后,会有两次返回,父进程中,fork返回值为子进程号>0。子进程中,fork返回值为0;

getpid()返回当前进程本身的pid。

getppid()返回当前进程的父进程pid。

分析上面打印输出可以看到:父进程中,fork返回了子进程pid3081,而父进程本身pid为3080,父进程的父进程,pid为2790。子进程中,fork返回了0,而子进程本身的pid为3081,子进程的父进程pid为1

这里可能会有一个疑问,子进程的getppid返回值应该为3080,为什么会是1呢?上网查证后发现,原来是由于父进程提前结束,导致子进程没了“爹”,变成孤儿进程,所以被inti进程接管,inti进程的进程号即为1.

修改上述代码,在父进程结尾增加sleep(1),挂起一秒,即让子进程先结束,打印信息如下。

father pid is 3166
getpid is 3165
getppid is 2790
child pid is 0
getpid is 3166
getppid is 3165

这次子进程的getppid就是父进程号了

你可能感兴趣的:(Linux进程,多进程,linux)