• Linux学习2-fork


    复制进程映像 fork()

    要想让进程同时执行多个函数,我们可以使用线程或从源程序中创建一个完全分离的进程,后者就像init的做法一样,而不像exec调用那样用新程序替换当前指向的线程。

    我们可以通过调用fork创建一个新进程。这个系统调用复制当前进程,在进程表中创建一个新的表项,新表项中许多属性和当前进程是相同的。

    新进程几乎和原进程一模一样,执行的代码也全部一样,但新进程有自己的数据空间,环境和文件描述符。

    fork和exec函数结合使用就是创建新进程所需要的一切了。

    #include<sys/type.h>

    #include<unistd.h>

    pid_t fork(void);

     在父进程中调用返回的是新的子进程的PID。新进程进继续执行,不过子进程中fork返回的是0.父子进程可以通过这一点来判断谁是父子。

    如果fork失败返回-1,通常是因为父进程所拥有的子进程数目超过规定限制。

     fork1.c    

    #include<sys/types.h>
    #include<unistd.h>
    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        pid_t pid;
        char *message;
        int n;
        
        printf("fork program starting!
    ");
        pid = fork();
        switch(pid)
        {
            case -1:
                perror("fork failed!");
                exit(1);
            case 0:
              message = "this is child";
                n = 5;
                 break;
            default :
            message = "this is parenet";
                n = 2;
                break;          
        }
    
        for(;n>0;n--)
        {
             puts(message);
             sleep(1);
        }
        exit(0);
    }

     

    等待一个进程

    当用fork启动一个子进程时,紫禁城就有了自己的生命周期并将独立运行。我们可以通过在父进程中调用wait函数让父进程等待子进程的结束。

    #include<sys/types.h>

    #inlcude<sys/wait.h>

    pid_t wait(int *stat_loc);

    wait系统调用将暂停父进程知道他的子进程结束为止。这个调用返回子进程的PID,它通常是已经结束运行的子进程的PID。状态信息允许父进程了解子进程的退出状态,及

    子进程main函数的返回值或子进程中exit函数的退出码。如果stat_loc不是空指针,状态信息将被写入它所指向的位置。

    我们可以通过sys/wait.h文件中定义的宏来解释状态信息。

    wait.c

    #include<sys/types.h>
    #include<sys/wait.h>
    #include<unistd.h>
    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        pid_t pid;
        char *message;
        int n;
        int exit_code;
        printf("fork program starting!
    ");
        pid = fork();
        if (pid < 0)
        {
            printf("this is fork error!
    ");
            exit(1);
        }else if(pid == 0)
        {
            printf("this is child!
    ");
            message = "child";
            n = 5;
            exit_code = 37; 
        }else
        {
            printf("this is parent!
    ");
            n = 3;
            message = "parent";
            exit_code = 0;
        }
        for(;n>0;n--)
        {
            puts(message);
            sleep(1);
        }
    //程序这一部分等待子进程完成。
    if (pid != 0) { int stat_val; pid_t child_pid; child_pid = wait(&stat_val); printf("child has finished:pid=%d ",child_pid); printf("this stat_val is :%d ",stat_val);
    //如果子进程正常结束,它就取一个非零值
    if
    (WIFEXITED(stat_val)) { //如果WIFEXITED非零,则返回子进程的退出码
    printf(
    "child exited with code %d ",WEXITSTATUS(stat_val)); }

    else { printf("child terminated abnormally "); } } exit(exit_code); }

     以上内容来自《Linux程序设计第四版》

  • 相关阅读:
    Swagger接入
    Elasticsearch5.0.1索引压测结果
    Elasticsearch5.0 BreakChange摘要
    Elasticsearch1.7到2.3升级实践总结
    Java动态代理全面分析
    Spring之AntPathMatcher
    Lock的实现之ReentrantLock详解
    Elasticsearch之client源码简要分析
    elasticserach 索引删除 源码分析
    httpClient4.5.2工具类总结
  • 原文地址:https://www.cnblogs.com/xiaodeyao/p/6390786.html
Copyright © 2020-2023  润新知