系统相关
首页 > 系统相关> > LINUX进程学习

LINUX进程学习

作者:互联网

LINUX进程学习

(一)什么是进程

(二)创建进程fork()函数

(三)进程的模拟运用

(四)vfork函数运用

(五)父进程等待子进程退出

(一)什么是进程

通俗地来讲,进程就是程序地一次活动,让程序跑起来,系统会产生一个进程。而程序是一个静态的文件。我们可以通过

// An highlighted block
CLC@Embed_Learn:~$ top		//可以查看当前进程

(二)创建进程fork()函数

// 函数讲解
FORK(2)                                                                               
NAME
       fork - create a child process

SYNOPSIS
       #include <unistd.h>

       pid_t fork(void);
RETURN VALUE
       On success, the PID of the child process is returned in the parent, and 0 is returned in the  child.   On  failure,  -1  is
       returned in the parent, no child process is created, and errno is set appropriately.

这个函数的作用是创建一个子进程,无需参数,创建成功时返回大于零的数是父进程,等于零是进入了子进程。

// An highlighted block
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main()
{

        pid_t pd;
        pd = fork();

        if(pd>0)
        {
                printf("this is father jincheng!%d\n",getpid());

        }else if(pd==0)
        {
                printf("this child jihceng!%d\n",getpid());
        }
        return 0;
}
// 运行结果,两个进程不一样
LS@Embed_Learn:~$ 
LS@Embed_Learn:~$ gcc jinchengtest1.c  -o test
LS@Embed_Learn:~$ ./test
this is father jincheng!4847
this child jihceng!4848


//在执行第一次程序的会走一个父进程,父进程的返回值大于零会输出那一句话。
//然后再走一遍程序的时候,因为已经产生了一个子进程,所以会走下面那一句。

如果以上还不够形象理解,我们继续举例说明:

// 代码展示
var foo = 'bar';
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<unistd.h>


int main()
{
        pid_t pd1;
        pid_t pd2;
        pid_t returnpd;

        pd1 = getpid();

        printf("before fork the pid = %d\n",pd1);

        returnpd = fork();

        pd2 = getpid();

        if(pd1==pd2){
        	printf("this is father jingcheng! pid=%d  returnpd=%d\n",getpid(),returnpd);}

        else{
        	printf("this is child jincheng! pid=%d  returnpd=%d\n",getpid(),returnpd);}

        return 0;

}

// 运行结果
LS@Embed_Learn:~$ ./test
before fork the pid = 5479
this is father jingcheng! pid=5479  returnpd=5480
this is child jincheng! pid=5480  returnpd=0

//通过结果我们可以看到父进程的fork函数返回的是子进程的pid,子进程返回0.

(三)进程的模拟运用

进程拿来干嘛呢?我们再模拟一个服务器的功能,我们运用父进程进行父进程的指令监听,接收到外界的用户需求时,会创建子进程进行响应。下面我们来实现这个功能。

// 代码展示
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
        pid_t pid1;
        pid_t pid2;
        pid_t returnpid;
        while(1){
                int data;
                printf("please input your choose:\n");
                scanf("%d",&data);
                if(data==1){
                        returnpid = fork();
                        if(returnpid>0){

                        }
                        else if(returnpid==0){
                                printf("do net connected! the pid=%d\n",getpid());
                                sleep(3);
                        }
                }
                else {
                        printf("not fonud!\n");
                }
}

        return 0;
};

(四)vfork函数运用

vfork与fork函数之间的区别
1.前者会拷贝一份父进程,后者是与父进程共享
2.前者是保证先执行子进程再执行父进程。

// An highlighted block
#include<stdlib.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>


int main()
{
        pid_t returnpid = vfork();

        int cnt =0;
        if(returnpid>0)
        {
                while(1){
                printf("the cnt = %d\n",cnt);
                printf("fu jingcheng!  the pid=%d\n",getpid());
                sleep(3);
        }
}
        else if(returnpid==0){
                while(1){
                printf("this if zijingcheng! the  pid=%d\n",getpid());
                cnt++;
                sleep(2);
                if(cnt==3){exit(0);}
        }
}
        return 0;
}
//可以得到反馈

(五)父进程等待子进程退出

我们这里需要用到

// An highlighted block
wait();//函数

通过收集子进程的状态码来判断是否子进程已经退出。

标签:fork,LINUX,pid,学习,getpid,printf,进程,include
来源: https://blog.csdn.net/qq_49422880/article/details/113701271