当前位置:   article > 正文

linux进程编程

linux进程编程

在学习linux进程编程之前,我们首先要知道什么程序,什么事进程。

当我们写完代码编译完生成的可执行文件,叫做程序,而打开这个程序去运行他,这是这个东西就变成了进程。

程序是一个静态的概念,进程是一个动态的概念!

在进程中,又分别有父进程和子进程。父进程是创造了子进程。子进程拥有和父进程一样的资源的数据。但是他们的存储空间不一样。

fork()函数,是创造进程。他的特征是调用会产生两次返回值。父进程调用返回新进程的ID。

getpid():这个是查询当前进程的ID。getppid()是查询当前进程的父进程的ID;

下面代码展示应用:

第一个:getpid();

int main()
{
        pid_t pid;
        pid = getpid();
        printf("my pid is %d\n",pid);

        while(1);
        return 0;
}

 这里就一个进程,getpid()查询后得到当前进程pid。

第二个代码:

int main()
{
        pid_t pid;
        pid = getpid();

        fork();

        printf("my pid is %d current %d\n",pid,getpid());
        return 0;
}

大家会看到这里代码运行结果打印了两遍。第一遍的pid是一样的,但是第二遍的pid是不一样的。这就出现了问题。

因为在开始定义pid = getpid()之前已经有一个进程运行了,fork()有创建了又一个进程,这个进程叫做子进程。这时候父进程开始运行,所以在printf中的getpid()得到的是父进程的pid。父进程运行后,子进程又开始运行,因为子进程和父进程有一样的数据,所以printf的pid就是原来父进程的pid,但是这时是子进程在运行,所以getpid()得到的结果就是子进程的pid,所以第二个打印pid不一样。

第三个代码:

int main()
{
        pid_t pid;
        pid_t pid2;
        pid = getpid();

        fork();

        pid2 = getpid();
        if(pid == pid2)
        {
                printf("this is father process\n");
        }
        else{
                printf("this is child print,child pid = %d\n",getpid());
        }
        return 0;
}  

fork()调用之前,getpid()得到的原进程的pid,当fork()创建以后,子进程出现。这是两个进程开始分别运行,父进程先运行。 这时候得到的pid2是是父进程pid,后面pid=pid2,所以打印第一个。但是当子进程运行时,pid2得到是子进程pid,所以这个时候的pid!=pid2.所以打印第二个。

第四个代码:

int main()
{
        pid_t pid;
        pid =  fork();
        printf("%d\n",pid);
        printf("%d\n",getpid());


        if(pid>0)
        {
                printf("this is father process  %d\n",getpid());
        }
        else if{
                printf("this is child print,child pid = %d\n",getpid());
        }
        return 0;
}

首先,fork的调用产生了新的进程,返回新进程的pid。所以第一个打印是新进程的pid。但是父进程开始运行,所以第二个getpid()得到的是父进程的pid,所以打印的是父进程的pid。这个pid是大于0的所以执行if,打印第三行结果,getpid()得到的也是父进程的pid,因为这个过程始终是父进程在运行。第二个是子进程开始运行,因为子进程调用fork()返回值是0,所以第四行打印的是0,这个时候到结束都是子进程在运行,所以这个时候是得到的是子进程的pid。

总结:子进程和父进程是一摸一样的,但是谁生了生谁就是谁的baba,他们有一样的数据,但存储空间不一样。在程序中就像有两个人,一个人干一遍,另一个人也要干一遍,就是说父进程执行一遍代码,子进程也执行一遍代码。谁执行的过程中调研getpid()就是得到的谁的进程pid。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/614676
推荐阅读
相关标签
  

闽ICP备14008679号