fork();

僵死进程: 父进程没有等待子进程,wait() 子进程会变成僵死进程。

int main(int arg, char *args[])
{
 
  pid_t pid = fork();//调用fork产生一个子进行
  int status;
  if (pid == -1)
  {
  printf("fork failed\n");
  return 0;
  }
  if (pid == 0)//子进程调用execve,执行ls -l命令
  {
          exit(0);//子进程退出了,变成了僵死进程。

  }
  else
  {

printf("father exit");

//wait(&status);//阻塞调用,直到子进程退出,wait才返回

sleep(10);//没有等待子进程状态。

     return 0;//父进程退出
  }
}

孤儿进程: 父进程退出子进程还没有退出,会由init进程接管变成孤儿进程。

int main(int arg, char *args[])
{
  close(STDOUT_FILENO);//关闭标准输出
  open("/dev/pts/2", O_WRONLY);//打开"/dev/pts/2",做为标准输出
  pid_t pid = fork();//调用fork产生一个子进行
  int status;
  if (pid == -1)
  {
  printf("fork failed\n");
  return 0;
  }
  if (pid == 0)//子进程调用execve,执行ls -l命令
  {
  char *args[] = { "/bin/ls", "-l", NULL };
  execve("/bin/ls", args, NULL);

  }
  else
  {

  return 0;//父进程退出
  }
}

//父进程等待子进程退出的代码
int main(int arg, char *args[])
{
  pid_t pid = fork();//调用fork之后会有两个进程
  int status;
  if (pid == 0)
  {
    printf("child begin\n");
    sleep(5);
    printf("child end\n");
    return -1;
  }

  if (pid > 0)
  {
    printf("parent begin\n");
    wait(&status);//阻塞调用,直到子进程退出,wait才返回
    printf("child return = %d\n", WEXITSTATUS(status));
    printf("parent end\n");
  }

  return 0;
}

//僵死进程
//父进程没有调用wait,子进程就退出了,这个时候子进程就成了僵死进程

进程退出的5种方式:

return 跟exit 在主函数main中效果是一样的,只是在子函数中,才有区别,子函数中return只是退出子函数,exit才是退出进程。

exit  在main函数中跟return是一样的,只是在子函数中不相同。

_exit

abort  异常退出。生成一个core.xxx文件

信号

时间: 2024-11-11 13:38:19

fork();的相关文章

linux fork 函数

计算机程序设计中的分叉函数.返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记:否则,出错返回-1.fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程.这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本.下面是fork函数工作的一个例子. #include <unistd.h> #include <stdio.h> int main () { pid_t fpid; //fork r

20169217 《Linux内核原理与分析》 第十周作业

实验内容 理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判断我们课程内容中的总结是否准确: 使用gdb跟踪分析一个schedule()函数 ,验证您对Linux系统进程调度与进程切换过程的理解: 特别关注并仔细分析switch_to中的汇编代码,理解进程上下文的切换机制,以及与中断上下文切换的关系: Linux系统进程调度与进程切换过程 进程调度分为三种类型: 中断处理过程(包括时钟中断.I/O 中断.系统调用和异常)中,

20135302魏静静——linux课程第八周实验及总结

linux课程第八周实验及总结 实验及学习总结 1. 进程切换在内核中的实现 linux中进程切换是很常见的一个操作,而这个操作是在内核中实现的. 实现的时机有以下三个时机: 中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule(): 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度: 用户

Linux期末总结

Linux内核学习总结 1.计算机是如何工作的? 存储程序计算机工作模型 X86汇编基础 汇编一个简单的C程序分析其汇编指令执行过程 2.操作系统是如何工作的? 三个法宝——存储程序计算机.函数调用堆栈.中断机制: 借助Linux内核部分源代码模拟存储程序计算机工作模型及时钟中断 在mykernel基础上构造一个简单的操作系统内核 3.构造一个简单的Linux系统MenuOS  Linux内核源代码简介 构造一个简单的Linux系统 跟踪调试Linux内核的启动过程 sched_init()进程

Linux内核分析8

周子轩 原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用gdb跟踪分析一个schedule()函数,理解Linux系统中进程调度的时机. 实验过程: 登陆实验楼虚拟机http://www.shiyanlou.com/courses/195 打开shell终端,执行以下命令: cd LinuxKernel rm -rf menu git clone https://git

Linux内核设计第八周学习总结 理解进程调度时机跟踪分析进程调度与进程切换的过程

陈巧然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.视频内容 Linux系统的一般执行过程 最一般的情况:正在运行的用户态进程X切换到运行用户态进程Y的过程 1. 正在运行的用户态进程X 2. 发生中断——save cs:eip/esp/eflags(current) to kernel stack, then load cs:eip(entry of a specific IS

分析Linux内核创建一个新进程的过程

一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct{ volatile long state; //进程状态,-1表示不可执行,0表示可执行,大于1表示停止 void *stack; //内核堆栈 atomic_t usage; unsigned int flags; //进程标识符 unsigned int ptrace; …… } 2.进程的创

《Linux内核分析》第六周学习笔记

<Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [学习视频时间:1小时 撰写博客时间:2小时] [学习内容:进程创建的过程.使用gdb跟踪分析内核处理函数sys_clone] 一.进程的描述 1.1 进程描述符task_struct数据结构(一) 1. 进程控制块PCB——task_struct 为了管理进程,内核

单线程你别阻塞,Redis时延问题分析及应对

单线程你别阻塞,Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞: 当redis的数据量达到一定级别后(比如20G),阻塞操作对性能的影响尤为严重: 下面我们总结下在redis中有哪些耗时的场景及应对方法: 耗时长的命令造成阻塞 keys.sort等命令 keys命令用于查找所有符合给定模式 pattern 的 key,时间复杂度为O(N), N 为数据库中 key 的数量.当数据库中的个