Linux C/C++ 进程管理

在UNIX/LINUX系统中,用户创建一个新进程的唯一方法就是调用系统调用fork(),调用该函数的进程被称作为父进程,而新创建的进程被称作为子进程,调用语法为下:

x_val = fork()

调用这个函数之后,之后的代码被子进程和父进程各执行一次,因为子进程拷贝了父进程的上下文逻辑副本,唯一的区别是x_val不一样,子的x_val是0,父的x_val是子进程的进程号,详细操作如下:

  • 为新的进程分配一个新的PCB 结构
  • 为子进程赋一个唯一的进程标识符PID
  • 做一个父进程的上下文逻辑副本,(代码段是引用,数据段和堆栈段是私有数据,需要深度拷贝)
  • 增加该进程相关联的文件表和索引节点表的引用数
  • 对父进程返回子进程的进程号,对子进程返回0

 

#include 
#include 
#include 

int main(){
    pid_t child=0;
    int i=2;
    if((child = fork())==-1)
    {
        printf("fork failed! \n");
        exit(0);
    }
    if (child==0){
        i+=3;
        printf("son progress\n%d\n",i);
    }
    i+=5;
    printf("progress\n%d\n",i);

    return 0;
}

这段代码会有三种输出结果,分别是5 7 10 ,7 5 10 ,5 10 7,以及一个fork failed

  父进程为了启动一个新的程序执行,需要使用到exec类的汉书,其作用是根据参数指定的文件名找到可执行文件,并用它来取代调用进程的内容,一旦一个进程调用了exec类的函数,系统将改进成的代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并根据新程序分配新的数据段和堆栈段,唯一留下的是PCB 和PID


#include 
#include 
#include 
/*

*/
int main(){
    pid_t child=0;
    if((child = fork())==-1)
    {
        printf("fork failed! \n");
        exit(0);
    }
    if (child==0){
        
        execlp("./print_1",0);

    }
    printf("%d\n",child);


    return 0;
}

 

你可能感兴趣的:(C/C++,Linux,操作系统)