Linux:进程创建

在这里插入图片描述

fork()

/*

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);
    作用:
        创建子进程
    返回值:
        fork()的返回值会返回两次:父和子进程都会有返回值
        成功:   
            父进程里返回创建的子进程的id
            子进程里面返回0
        失败:
            父进程返回-1
    注:通过fork() 返回值可以区分父、子进程。


*/

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(){
    
    

    pid_t pid = fork(); //pid_t 就是 int型

    if(pid > 0){
    
     //当前是父进程
        printf("parent: pid : %d \n", pid);
        printf("I am parent process, pid : %d, ppid : %d \n", getpid(), getppid());
    }else if(pid == 0){
    
    
        //当前是子进程
        printf("I am child process, pid : %d, ppid : %d \n", getpid(), getppid());
    }

    for(int i=0; i<5; i++){
    
    
        printf("i : %d, pid : %d \n", i, getpid());
        sleep(1);
    }

    return 0;
}

在这里插入图片描述

写时拷贝(*)

/*

实际上,更准确来说,Linux的 fork()使用是通过写时拷贝(copy- on-write)实现的
写时拷贝是一种可以推迟甚至避免拷贝数据的技术。
内核此时并不复制整个进程的地址空间,而是让父子进程共享同一个地址空间。
只用在需要写入的时候才会复制地址空间,从而使各个进程拥有各自的地址空间。
也就是说,资源的复制是在需要写入的时候才会进行,在此之前,只有以只读方式共享。
注意:fork之后父子进程共享文件,
fork产生的子进程与父进程相同的文件
文件描述符指向相同的文件表,引用计数增加,
*/

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(){
    
    

    int num = 10;

    pid_t pid = fork();

    if(pid > 0){
    
    
        printf("parent: num = %d \n", num);
        num + 10;
        printf("parent: num + 10 = %d \n", num);
    }else{
    
    

        printf("child: num = %d \n", num);
        num += 100;

        printf("child: num + 100 = %d \n", num);
    }

    return 0;
}

carey@ubuntu:~/Linux/lesson10_threadC$ gcc fork1.c -o fork1
carey@ubuntu:~/Linux/lesson10_threadC$ ./fork1
parent: num = 10 
parent: num + 10 = 10 
child: num = 10 
child: num + 100 = 110 
carey@ubuntu:~/Linux/lesson10_threadC$ 


GDB多进程调试(*)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44861043/article/details/121395203
今日推荐