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\n",getpid());
    //0.在fork前一定要刷新之前打开的流
    fflush(NULL);
    //1.创建进程
    pid = fork();
    if( pid < 0 )
    {
        perror("fork()");
        exit(1);
    }
    //2.子进程
    if(pid == 0)
    {
        printf("[%d]:child is working\n",getpid());
    }
    else
    {
        printf("[%d]:parent is working\n",getpid());
    }
    printf("[%d]:end\n",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 输出到终端(行缓冲,加了\n刷新了缓冲区,所以begin打印了一次)

*[root]# ./forkbase > /tmp/out 重定向到一个文件,文件是全缓冲模式(\n只是换行),由于子进程继承父进程的一切,那么缓冲区就有两个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(轻量级进程)---线程

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

进程号顺次向下使用