zoukankan      html  css  js  c++  java
  • linux高编进程-------进程创建fork 、getpid 、getppid

    创建一个进程:

    /********************
     *功能:创建一个新进程,通过复制当前进程(和父进程一样),执行的位置都一样
     *pid_t:一般是16位的有符号的整型数,不够可以typedef    
     * 返回值:非0 :“在父进程中”--->返回子进程编号
     *         0 :”在子进程中“--->返回0
     *        -1 :失败,并设置errno
     * ****************/
    pid_t fork(void);

    父子进程区别:fork的返回值不一样

                        pid不同

                        ppid不同

                        未决信号(未响应的信号)和文件锁不继承

           资源利用量归0

    init进程:是所有进程的祖先进程---1号进程

    eg:简单创建一个子进程

    /************************
     *创建一个子进程
     ***********************/
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main()
    {
        pid_t pid ;
        printf("[%d]:begin
    ",getpid());
        //0.在fork前一定要刷新之前打开的流
        fflush(NULL);
        //1.创建进程
        pid = fork();
        if( pid < 0 )
        {
            perror("fork()");
            exit(1);
        }
        //2.子进程
        if(pid == 0)
        {
            printf("[%d]:child is working
    ",getpid());
        }
        else
        {
            printf("[%d]:parent is working
    ",getpid());
        }
        printf("[%d]:end
    ",getpid());
        exit(0);
    }

    不加fflus有两种结果

    结果1:

    [root]# ./forkbase
    [3862]:begin
    [3862]:parent is working
    [3862]:end
    [3863]:child is working
    [3863]:end

    结果2:

    [root]# ./forkbase > /tmp/out
    [root]# cat /tmp/out
    [3997]:begin
    [3997]:parent is working
    [3997]:end
    [3997]:begin
    [3998]:child is working
    [3998]:end

    *[root]# ./forkbase 输出到终端(行缓冲,加了 刷新了缓冲区,所以begin打印了一次)

    *[root]# ./forkbase > /tmp/out 重定向到一个文件,文件是全缓冲模式( 只是换行),由于子进程继承父进程的一切,那么缓冲区就有两个begin,所以begin就会被打印2次,)

    *:调度器的调度策略来决定哪个进程先运行

    获取pid号:

    #include <sys/types.h>
    #include <unistd.h>
    
    /********获取当前进程pid号*********/
    pid_t getpid(void);
    
    /********获取当前进程的父进程pid号*********/
    pid_t getppid(void);

    =======================================================================

    man ps 

    命令ps:输出进程的一些信息

    ps axf:打印进程的信息         PID         TTY         STAT      TIME         COMMAND

                                         进程号      占据终端     状态     消耗时间     哪个命令触发的

    ps axm:详细信息查看  

    ps ax -L :以linux特有的方式查看   LWP(轻量级进程)---线程

    =======================================================================

    进程号顺次向下使用

  • 相关阅读:
    WSAAsyncSelect模型的小i例子
    网络编程之Winsock2
    网络编程系列之Winsock
    网络编程系列之前言
    winpcap 编程及环境配置
    inno setup 一款强大的安装包制作工具
    创建windows服务程序
    python模块之logging
    ABOUT ME
    [省选联考 2020 A 卷] 树
  • 原文地址:https://www.cnblogs.com/muzihuan/p/5283805.html
Copyright © 2011-2022 走看看