嵌入式Linux并发程序设计,进程,进程创建fork(),进程号查询getpid(),进程结束exit()/_exit()

1,进程创建fork(),获取当前进程的进程号getpid()

#include <unistd.h>
pid_t fork(void);

  1. 创建新的进程,失败时返回-1
  2. 成功时父进程返回子进程的进程号,子进程返回0
  3. 通过fork的返回值区分父进程和子进程

进程创建fork()示例,getpid()

pid_t  pid;

if ((pid = fork()) < 0) 
{
	perror(“fork”);  
	return -1;
}
else  if (pid == 0) 
{
	printf(“child  process :  my pid  is %d\n”, getpid());
}
else 
{
	printf(“parent  process :  my pid  is  %d\n”, getpid());
}  

2,父子进程

  1. 子进程继承了父进程的内容:代码、数据、系统数据
  2. 父子进程有独立的地址空间,互不影响
  3. 若父进程先结束
    ·子进程成为孤儿进程,被init进程收养(init进程是Linux内核启动后创建的以一个用户级进程,进程号为1)
    ·子进程变成后台进程
  4. 若子进程先结束
    ·父进程如果没有及时回收,子进程变成僵尸进程
  5. 系统规定,每个进程结束时,必须由其父进程回收

子进程从何处开始运行?

  1. 父进程从main函数开始运行
  2. 子进程从fork()的下一条语句(下一条指令)开始执行。(父进程执行到fork()时,PC中存放的是fork()的下一条指令的地址,而子进程继承了父进程,也是从fork()的下一条指令开始执行,子进程并没有执行fork())

父子进程谁先执行?

  1. 不确定,内核先调度子进程,子进程就先执行;内核先调度父进程,父进程就先执行
  2. 一般来说,父进程创建完fork()后,如果时间片没有用完,通常会先执行父进程,父进程的时间片用完后,子进程就会被调度,再执行

父进程能否多次调用fork()?子进程呢?

  1. 理论上父进程没有限制,父进程可以多次调用fork(),创建多个子进程,但是需要考虑这些子进程的回收
  2. 子进程同样可以调用fork(),子进程创建的子进程叫孙进程。看程序应用的需求

3,进程结束 exit()/_exit()

#include <stdlib.h>
#include <unistd.h>
void exit(int status);//<stdlib.h>
void _exit(int status);//<unistd.h>

  1. 结束当前的进程并将status(低八位的值)返回
  2. exit结束进程时会刷新(流)缓冲区,_exit结束进程时不会刷新(流)缓冲区

进程结束exit()示例

#include <stdio.h>
#include <stdlib.h>

int main(void) 
{
	printf(“this process will exit\n”);//标准输出是行缓冲,字符串末尾有换行符,此时字符串写到了标准输出的缓冲区里,遇到了换行符,会刷新流缓冲区,并输出
	printf(“this is the end”);//标准输出是行缓冲,字符串末尾没有换行符,此时只是将字符串写到了标准输出的缓冲区里,并没有输出
	exit(0);//程序结束时会刷新流缓冲区,将缓冲区中的内容输出到终端
	printf(“never  be  displayed”);
}

this process will exitlinux@linux:~/test/process$ vi a.c
linux@linux:~/test/process$ gcc a.c 
linux@linux:~/test/process$ ./a.out 
this process will exit
this is the endlinux@linux:~/test/process$ 

进程结束_exit()示例

#include <stdio.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
	printf(“this process will exit\n”);//标准输出是行缓冲,字符串末尾有换行符,此时字符串写到了标准输出的缓冲区里,遇到了换行符,会刷新流缓冲区,并输出
	printf(“this is the end”);//标准输出是行缓冲,字符串末尾没有换行符,此时只是将字符串写到了标准输出的缓冲区里,并没有输出
	exit(0);//程序结束时不会刷新流缓冲区

	printf("never be displayed");

	return 0;
}
this is the endlinux@linux:~/test/process$ vi a.c
linux@linux:~/test/process$ gcc a.c 
linux@linux:~/test/process$ ./a.out 
this process will exit

猜你喜欢

转载自blog.csdn.net/m0_37542524/article/details/83791818