频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

linux多进程的总结(fork用法)

来源:中国IT实验室 作者:佚名 出处:巧巧读书 2008-05-28 进入讨论组


    简单理解为,一个进程表示的,就是一个可执行程序的一次执行过程中的一个状态。操作系统对进程的管理,典型的情况,是通过进程表完成的。进程表中的每一个表项,记录的是当前操作系统中一个进程的情况。

对于单 CPU的情况而言,每一特定时刻只有一个进程占用 CPU,但是系统中可能同时存在多个活动的(等待执行或继续执行的)进程。

    fork()用于从已存进程中建立一个新进程,新进程为子进程,老进程为父进程.可以通过检查"fork()"地返回值知道哪个是子进程哪个是父进程。父进程得到的返回值是子进程的进程号,而子进程则返回0。

    基本模式是:

    #include
    #include
    #include
    #include
    #include
    #include
    main()
    {
    pid_t pid;
    int rv;
    pid=fork(); //创建进程
    switch(pid)
    {
    case -1: //返回-1的话,进程创建没成功
    perror("fork");
    exit(1);
    case 0:
    printf(" CHILD: This is the child process!\n");
    printf(" CHILD: My PID is %d\n", getpid()); //调用 getpid 得到自己的 PID
    printf(" CHILD: My parent's PID is %d\n", getppid()); //getppid() 得到父进程的 PID
    printf(" CHILD: Enter my exit status (make it small): ");
    scanf(" %d", &rv);
    printf(" CHILD: I'm outta here!\n");
    exit(rv);
    default:
    printf("PARENT: This is the parent process!\n");
    printf("PARENT: My PID is %d\n", getpid());
    printf("PARENT: My child's PID is %d\n", pid); //fork() 返回的default值意味着你正在父进程中,返回值是子进程的 PID 。这是得到子进程 PID 的唯一方法
    printf("PARENT: I'm now waiting for my child to exit()...\n");
    wait(&rv); //父进程必须等待子进程完成收拾子进程的残余后才能继续
    printf("PARENT: My child's exit status is: %d\n", WEXITSTATUS(rv)); 也就是父进程不能先于子进程消亡。
    printf("PARENT: I'm outta here!\n");
    }
    }
    //EXITSTATUS() 是一个宏,从 wait() 返回值中提取实际的返回值。
    // wait() 怎么知道在哪个进程上等待?我的意思是,由于父进程可以有多个子进程, wait() 实际等待地是哪一个?答案非常简单,它等待最先退出的那一个。你可以通过以子进程的 PID 为参数调用 waitpid() 指明是哪一个子进程。

    if (!fork())
    {
    printf("I'm the child!\n");
    exit(0);
    } else
    {
    printf("I'm the parent!\n");
    wait(NULL);
    }

    linux 是多用户和多进程的操作系统,进程在操作系统中的创建,都会生成一个进程描述块,描述当前进程的所有信息,包括,数据段、代码段、堆栈段的地址,当前进程的环境变量,文件描述符等。

    fork函数过程:操作系统先创建一个进程描述块,然后把父进程的所有进程描述符的信息精确拷贝过来,和父进程一样(除了进程ID不一样外),代码段共享,数据段和堆栈段复制,所有的寄存器的值全部精确拷贝,文件描述符也许精确拷贝。

    fork的返回值,fork在父进程空间中返回子进程的PID,在子进程空间中返回0。

更多文章 更多内容请看Linux集群技术体验Linux的音影世界Linux驱动大全专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章