美文网首页
fork父子进程

fork父子进程

作者: harrytc | 来源:发表于2019-01-29 12:55 被阅读5次

    内存分为四个区域 内核区 堆 栈 常量区
    子进程是父进程的复制品,执行一次返回两次,在使用 堆,栈,或者常量区的时候都是写时复制,以下是程序示例

    func.h
    #include <sys/stat.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <stdlib.h>
    #include <time.h>
    #include <pwd.h>
    #include <grp.h>
    #include <fcntl.h>
    #include <sys/select.h>
    #include <sys/time.h>
    #define args_check(argc,num) {if(argc!=num) {printf("error args\n");return -1;}}
    
    
    fork.c
    #include "func.h"
    int g_iNum=10;
    int main()
    {
        pid_t pid;
        pid=fork();
        if(0==pid)
        {//这里是子进程的代码
            printf("I am child process,g_iNum=%d\n",g_iNum);
            g_iNum=5;
            printf("I am child process,g_iNum=%d,g_iNum_addr=%p\n",g_iNum,&g_iNum);
        }else{
         //这里是父进程的代码
            printf("I am parent process,g_iNum=%d\n",g_iNum);
            sleep(1);
            printf("I am parent process,g_iNum=%d,g_iNum_addr=%p\n",g_iNum,&g_iNum);
            return 0;
        }
    }
    
    
    #include "func.h"
    //堆空间
    int main()
    {
        pid_t pid;
        char *p=(char*)malloc(20);
        strcpy(p,"hello");
        pid=fork();
        if(0==pid)
        {//这里是子进程的代码
            printf("I am child process,%s\n",p);
            strcpy(p,"world");
            printf("I am child process,%s,%p\n",p,p);
        }else{
         //这里是父进程的代码
            printf("I am parent process,%s\n",p);
            sleep(1);
            printf("I am parent process,%s,%p\n",p,p);
            return 0;
        }
    }
    
    
    //栈空间
    #include "func.h"
    
    int main()
    {
        pid_t pid;
        int iNum=10;
        pid=fork();
        if(0==pid)
        {//这里是子进程的代码
            printf("I am child process,iNum=%d\n",iNum);
            iNum=5;
            printf("I am child process,iNum=%d,iNum_addr=%p\n",iNum,&iNum);
        }else{
         //这里是父进程的代码
            printf("I am parent process,iNum=%d\n",iNum);
            sleep(1);
            printf("I am parent process,iNum=%d,iNum_addr=%p\n",iNum,&iNum);
            return 0;
        }
    }
    
    #include "func.h"
    
    int main()
    {
        pid_t pid;
        int fd=open("file",O_RDWR);
        pid=fork();
        if(0==pid)
        {//这里是子进程的代码
            printf("I am child process\n");
            lseek(fd,5,SEEK_SET);
        }else{
         //这里是父进程的代码
            printf("I am parent process\n");
            sleep(1);
            char buf[128]={0};
            read(fd,buf,sizeof(buf));
            printf("I am parent process,%s\n",buf);
            return 0;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:fork父子进程

          本文链接:https://www.haomeiwen.com/subject/nzfxsqtx.html