什么是子进程和父进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是子进程和父进程相关的知识,希望对你有一定的参考价值。

1、父进程

指已创建一个或多个子进程的进程。在UNIX里,除了进程0以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程。

2、子进程

指的是由另一进程(对应称之为父进程)所创建的进程。子进程继承了对应的父进程的大部分属性,如文件描述符。在Unix中,子进程通常为系统调用fork的产物。在此情况下,子进程一开始就是父进程的副本,而在这之后,根据具体需要,子进程可以借助exec调用来链式加载另一程序。

扩展资料

父子进程之间的关系

1、关于资源

子进程得到的是除了代码段是与父进程共享的意外,其他所有的都是得到父进程的一个副本,子进程的所有资源都继承父进程,得到父进程资源的副本,既然为副本,也就是说,二者并不共享地址空间。两个是单独的进程,继承了以后二者就没有什么关联了,子进程单独运行。

2、关于文件描述符

继承父进程的文件描述符时,相当于调用了dup函数,父子进程共享文件表项,即共同操作同一个文件,一个进程修改了文件,另一个进程也知道此文件被修改了。

参考资料来源:百度百科-父进程

参考资料来源:百度百科-子进程

参考技术A 在程序设计时,某一个具体的功能模块可以通过函数或是线程等不同的形式来实现。对于同一进程而言,这些函数、线程都是存在于同一个地址空间下的,而且在执行时,大多只对与其相关的一些数据进行处理。如果算法存在某种错误,将有可能破坏与其同处一个地址空间的其他一些重要内容,这将造成比较严重的后果。为保护地址空间中的内容可以考虑将那些需要对地址空间中的数据进行访问的操作部分放到另外一个进程的地址空间中运行,并且只允许其访问原进程地址空间中的相关数据。具体的,可在进程中通过CreateProcess()函数去创建一个子进程,子进程在全部处理过程中只对父进程地址空间中的相关数据进行访问,从而可以保护父进程地址空间中与当前子进程执行任务无关的全部数据。对于这种情况,子进程所体现出来的作用同函数和线程比较相似,可以看成是父进程在运行期间的一个过程。为此,需要由父进程来掌握子进程的启动、执行和退出。

使用C创建子进程和父进程

我在C中制作以下代码。我正在编写一个程序,使用fork系统调用创建一个新进程。然后我想检查哪一个是活动的,最后是否是子进程返回该文件中所有目录的列表,或者如果它是父进程等待终止子进程。

以下是我的代码:

#include <stdio.h>
#include <string.h>
#include <dirent.h> 
#include <iostream>


int main(){
  int pid = fork();
  if(pid < 0){
    printf(stderr, "Fork call failed! 
");
  }
  else if(pid == 0){
    printf("This process is the child from fork=%d
", pid);
    printf("Thecurrent file inside the directory are:
");
    DIR *d;
    struct dirent *dir;
    d = opendir(".");
    if (d) {
      while ((dir = readdir(d)) != NULL) {
    printf("%s
", dir->d_name);
      }
      closedir(d);
    }
    exit(0);
  }
  else{
    printf("This process is the parent from fork=%d
", pid);
    int stats;    
    //parent process waits for child to terminate
    waitpid(pid, &stats, 0);

    if(stats == 0){
      printf("This process is terminated.");
    }

    if(stats == 1){
      printf("This process is terminated and an error has occured.");
    }
  }
  return 0;
}
fatal error: iostream: No such file or directory  #include <iostream>
                    ^ compilation terminated.

如果我删除#include <iostream>,我得到:

/usr/include/stdio.h:362:12: note: expected ‘const char * __restrict__’ but argument is of type ‘struct _IO_FILE *’

我该如何解决这个问题?

答案

您的错误发生在对printf()的第一次函数调用中:

printf(stderr, "Fork call failed! 
");

它实际上应该是fprintf()而不是:

fprintf(stderr, "Fork call failed! 
");

另外,不要忘记包括:

  • unistd.hfork()
  • sys/types.hsys/wait.hwaitpid()
  • stdlib.hexit()

并删除#include <iostream>,因为这是为了C ++。

以上是关于什么是子进程和父进程的主要内容,如果未能解决你的问题,请参考以下文章

Linux 编程之信号篇:异常监控必知必会

Linux 编程之信号篇:异常监控必知必会

linux创建进程fork的方法步骤

使用C创建子进程和父进程

fork出的子进程和父进程

fork出的子进程和父进程