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

2019-07-12 22:10发布

文章目录

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

#include
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 ”, getpid()); } else { printf(“parent process : my pid is %d ”, 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
#include
void exit(int status);//
void _exit(int status);//
  1. 结束当前的进程并将status(低八位的值)返回
  2. exit结束进程时会刷新(流)缓冲区,_exit结束进程时不会刷新(流)缓冲区

进程结束exit()示例

#include #include int main(void) { printf(“this process will exit ”);//标准输出是行缓冲,字符串末尾有换行符,此时字符串写到了标准输出的缓冲区里,遇到了换行符,会刷新流缓冲区,并输出 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 #include int main(int argc, const char *argv[]) { printf(“this process will exit ”);//标准输出是行缓冲,字符串末尾有换行符,此时字符串写到了标准输出的缓冲区里,遇到了换行符,会刷新流缓冲区,并输出 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