Linux的进程控制的初步学习

定义:

进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元

  • 程序是放到磁盘的可执行文件
  • 进程是指程序执行的实例

进程和程序的区别:

进程是动态的,程序是静态的;

进程是暂时的,程序使长久的;

进程与程序组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)

进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。

Linux进程:

Linux系统是一个多进程的系统,它的进程之间具有并行性、互不干扰等特点。 也就是说,每个进程都是一个独立的运行单位,拥有各自的权利和责任。其中,各个进程都运行在独立的虚拟地址空间,因此,即使一个进程发生异常,它也不会影响到系统中的其他进程。

进程PID:

进程ID(PID):标识进程的唯一数字 父进程的ID(PPID) 启动进程的用户ID(UID)

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
	printf("pid : %d\n", getpid());
	printf("ppid : %d\n", getppid());

	while (1);
	return 0;
}

进程调度:

  调度方式:             

  •  抢占式              

   •  非抢占式

调度算法:

先来先服务调度算法

短进程优先调度算法

高优先级优先调度算法

★时间片轮转法

进程创建fork:

#include <unistd.h> 

pid_t fork(void) 

功能:创建子进程  

  fork的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值:

返回值:

  • 0:  子进程
  • 子进程ID(大于0):父进程
  • -1: 出错
  • #include <sys/types.h>
    #include <unistd.h>
    int main()
    	{
    		pid_t pid;
    		/*此时仅有一个进程*/
    		pid=fork();
    
                  /*此时已经有两个进程在同时运行*/
    		if(pid<0)
    			printf("error in fork!");
    		else if(pid==0)
    			printf("I am the child process, ID is %d\n",getpid());
    		else
    			printf("I am the parent process,ID is %d\n",getpid());
        }

vfork:

表头文件: #include<unistd.h>

定义函数: pid_t vfork(void);

函数说明: vfork()会产生一个新的子进程,其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码,组代码,环境变量、已打开的文件代码、工作目录和资源限制等。 子进程不会继承父进程的文件锁定和未处理的信号。 注意,Linux不保证子进程会比父进程先执行或晚执行,因此编写程序时要留意死锁或竞争条件的发生。

int main(void)
{
        pid_t pid;
	   int count=0;
        pid = vfork();
	   if (0 == pid)
        {
            count++;
	       printf( “count = %d\n", count );
            exit(1);
        }
        else if (pid > 0)
        { 
            count++;
	       printf( “count = %d\n", count );
        }
	   return 0;
}

fork VS vfork:

1.   fork:子进程拷贝父进程的数据
      vfork:子进程与父进程共享数据

2.   fork:父、子进程的执行次序不确定
	   vfork:子进程先运行,父进程后运行

 

exec函数:

#include<unistd.h>

int execl(const char * path,const char * arg1, ...)

参数: path:被执行程序名(含完整路径)。

arg1 – argn: 被执行程序所需的命令行参数,含程序名。以空指针(NULL)结束。

#include <unistd.h>
int main()
{
    char * argv[ ]={“ls”,”-l”,”/etc/passwd”,(char*)0};	
    execv(“/bin/ls”,argv);
}

进程等待wait函数:

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait (int * status)
功能:阻塞该进程,直到其某个子进程退出。
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{   pid_t pc,pr;
     pc = fork();
     if(pc == 0){
      printf(“This is child process with pid of %d\n”,getpid());
      sleep(10); /* 睡眠10秒钟 */
      }
      else if(pc > 0){
       pr=wait(NULL); /* 等待 */
       printf("I catched a child process with pid of %d\n"),pr);
       }
       exit(0);
}

猜你喜欢

转载自blog.csdn.net/wow66lfy/article/details/81710767