进程创建fork getpid getppid

Posted muzihuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程创建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(轻量级进程)---线程

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

进程号顺次向下使用

 

以上是关于进程创建fork getpid getppid的主要内容,如果未能解决你的问题,请参考以下文章

利用fork创建子进程

Python 进程

进程控制

子进程和父进程关系以及缓冲区应用

linux 进程的创建

python__系统 : 进程