Linux进程:
进程是一个动态的实体,是程序的一次执行过程。进程是操作系统资源分配的基本单元。进程与程序的区别在于 进程是动态的,程序进静态的;进程是运行中的程序,程序是一些保存在硬盘上的可执行的代码。
为了能让计算机在同一时间执行更多任务,在进程内部又划分了许多线程。线程基本上不拥有系统资源,它与同属于一个进程的其他线程共享进程拥有的全部资源
创建进程:
系统调用fork()是创建一个新进程的唯一方法,除了极少数以特殊方式创建的进程,如init进程。创建一个子进程之后,父子进程争夺CPU,强到CPU者执行,另一个被挂起。如果想要父进程等待子进程执行完毕后再继续执行,可以在 fork 操作后调用 wait 或 waitpid 。子进程在被 fork 之后可以通过调用 exec 函数执行其他程序。
fork 函数有两个返回值,一个是父进程调用 fork 后 返回的是子进程的 ID;另一个是子进程中 fork 函数的返回值,该返回值为0,
如果fork 调用失败,返回 -1 。如:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
pid_t pid;
puts("Process Creation Study\n");
pid=fork();
switch(pid)
{
case 0:
printf("Child process is running,CurPid is %d,ParentPid is %d\n",pid,getpid());
break;
case -1:
perror("Process creation failed \n");
break;
default:
printf("Parent process is running,ChildPid is %d ,ParentPid is %d\n",pid,getpid());
break;
}
exit(0);
return 0;
}
#include <sys/types.h>
基本系统数据类型
是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型。linux编程中经常用到的头文件。
fork 和 vfork 区别
vfork 也可以用来创建进程,二者异同点如下:
1.vfork 和 fork 一样都是调用一次,返回两次;
2.使用fork创建进程,子进程只是完全复制父进程的资源,子进程独立与父进程。而使用 vfork 创建子进程时,子进程共享父进程的地址空间,
即子进程完全运行于父进程的地址空间上。子进程对该地址空间中任何数据的修改同样为父进程所见。
3. fork 创建子进程时,哪个进程先运行取决于系统的调度算法。而 vfork 创建进程时,保证子进程先运行,当它调用 exec 或 exit 之后,父进程
才可以被调度运行。如果在调用 exec 或 exit 之前子进程要依赖父进程的某个行为,就会导致死锁。