• Linux下进程控制相关


    以下内容仅作为个人记录的参考,但也欢迎读者前来指正。

    fork()

    #include<sys/types.h>
    #include<unistd.h>
    
    pid_t fork(void)
    
    返回:
    -1:出错。
    0:子进程
    否则为父进程。
    #include<stdio.h>
    
    #include<sys/types.h>
    #include<unistd.h>
    
    int main()
    {
            pid_t result;
            result = fork();
            if(result==-1)
            {
                    printf("fork出错
    ");
                    return 0;
            }
            else if(result==0)
            {
                    printf("this is child process. pid = %d
    .",getpid());
                    printf("my father's pid = %d
    ",getppid());
            }
            else
            {
                    printf("this is parent process.pid = %d
    .",getpid());
            }
            return 0;
    }

     为什么父进程的id不是25905呢,有点奇怪。

    这就是不正常的情况,父进程pid变了,说明原来的父亲没了。没了,在这里看来只能是运行结束了。

    所以延长一下父进程的进程时间。

    #include<stdio.h>
    
    #include<sys/types.h>
    #include<unistd.h>
    
    int main()
    {
            pid_t result;
            result = fork();
            if(result==-1)
            {
                    printf("fork出错
    ");
                    return 0;
            }
            else if(result==0)
            {
                    printf("this is child process. pid = %d
    .",getpid());
                    printf("my father's pid = %d
    ",getppid());
                    printf("add a line to print.
    ");
            }
            else
            {
                    printf("this is parent process.pid = %d
    .",getpid());
                    printf("the result is %d
    ",result);
                    printf("add a line to print.
    ");
                    printf("add a line to print1.
    ");
                    getchar();//阻塞输出
            }
            return 0;
    }

     果然,父进程结束太快,所以儿子被别人收养了。

    那么,刚才pid为1的又是什么进程呢。

     不太清楚,可能就是单纯被某个系统进程收养了吧。

    可以参考此篇博文。

    https://blog.csdn.net/Oerror_/article/details/104361264

    退出进程:

    #include<stdlib.h>
    exit(0)
    
    #include<unistd.h>
    _exit(0)
    
    一般填0代表正常退出。
    
    区别在于exit会对缓冲区做一些操作。
    比如输出缓冲区的内容。
    #include<stdio.h>
    
    #include<sys/types.h>
    #include<unistd.h>
    
    int main()
    {
            pid_t result;
            result = fork();
            if(result==-1)
            {
                    printf("fork出错
    ");
                    return 0;
            }
            else if(result==0)
            {
                    printf("子进程调用exit(0)
    ");
                    printf("this is a test line.");
                    _exit(0);
            }
            else
            {
                    printf("父进程调用exit(0)
    ");
                    printf("this is a test line.");
                    exit(0);
            }
            return 0;
    }

     区别就在于,_exit(0)比exit(0)少输出了一些内容。

    waitpid(),这里就略掉wait()了。

    #include<stdio.h>
    
    #include<sys/types.h>
    #include<unistd.h>
    #include<stdlib.h>
    
    int main()
    {
            pid_t result;
            result = fork();
            if(result==-1)
            {
                    printf("fork出错
    ");
                    return 0;
            }
            else if(result==0)
            {
              printf("i am child. my pid is %d. ",getpid()); sleep(
    5); exit(0); } else { pid_t pr; do{ pr = waitpid(result,NULL,WNOHANG); if(pr==0) { printf("the child process has not exited. "); sleep(1); } } while(pr==0); if(pr==result) { printf("the child pid is %d ",pr); } else { printf("error occured. "); } } return 0; }

    此外,也并不是简单的父进程就输出5遍,还可能因为执行速度执行6遍。

    还有一个创建进程的就是exec函数族。

     

  • 相关阅读:
    “Hello World”团队第一周博客汇总
    SFTP服务器之创建普通用户
    软工2017第五周——个人PSP
    "Hello world!"团队第一次会议
    软工2017第四周作业--结对编程之四则运算
    软工2017第四周作业结对编程——个人psp
    软工2017第四周作业结对编程——单元测试
    软工2017第四周作业——代码规范
    软工第三次作业——个人PSP
    iOS原生和React-Native之间的交互1
  • 原文地址:https://www.cnblogs.com/dayq/p/15362222.html
Copyright © 2020-2023  润新知