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。 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值