进程的概念:进程是一个具有独立功能的程序的一次运行活动、 资源分配的最小单元。
进程与程序:1、程序是放到磁盘里的可执行文件(静态的、长久的)
2、进程是指程序执行的实例(动态的、短暂的)一个状态的变化过程
通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。
创建:父进程(PPID)—>子进程(PID)——>孙进程 启动进程的用户ID(UID)
在Linux系统中,进程具有并行性、互不干扰等特点。一个进程发生异常不会影响其他进程。
(1)、“数据段”存放的是全局变量、常数以及动态数据分配的数据空间;
(2)、“代码段”存放的是程序代码的数据。
(3)、“堆栈段”存放的是子程序的返回地址、子程序的参数以及程序的局部变量等。
进程互斥:是指当有若干进程都要使用某一共享资源时,任何时刻最多允许一个进程使用,其他要使用该资源的进程必须等待,直到占用该资源者释放了该资源为止。
1、获取ID:getpid
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void) 获取本进程ID。
pid_t getppid(void) 获取父进程ID
#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;
}
【注】:加while死循环是为了让这个进程不结束,才可以获取id
2、fork
#include <unistd.h>
pid_t fork(void)
功能:创建子进程
fork的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值:
返回值: 0: 子进程 // 子进程ID(大于0):父进程 // -1: 出错
(1)、父进程创建子进程
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
int a = 0;
pid = fork(); //创建子进程
if (-1 == pid) //失败返回-1
{
perror("fork");
exit(1);
}
else if (0 == pid) //子进程
{
a++;
printf("Child a = %d %p\n", a, &a);
printf("This is ChildProcess pid %d ppid %d!\n", getpid(), getppid());
printf("%d\n", pid);
}
else //父进程
{
a++;
printf("Parent a = %d %p\n", a, &a);
printf("This is ParentProcess %d!\n", getpid());
printf("%d\n", pid);
}
return 0;
}
值得注意的是fork( )创建子进程是大多数情况是先返回0,再返回子进程的ID。
(2)、父进程写,子进程读 fork实现
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/typ