程序和进程
程序:是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存、打开的文件、设备、锁…)。
进程:是一个抽象的概念,与操作系统原理联系紧密,进程是活跃的程序,占用系统资源,在内存中执行(程序运行起来,产生一个进程)。
复制进程 fork
用man命令查看fork方法
pid_t fork(void);
函数返回类型 pid_t 实质是 int 类型,Linux 内核 2.4.0 版本的定义是:
fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。在父进程中返回子进程的 pid,在子进程中返回 0,失败返回-1。
每个进程都有一个独特(互不相同)的进程标识符(process ID),可以通过 getpid()
函数获得,还有一个记录父进程 pid
的变量,可以通过 getppid()
函数获得变量的值。
fork
函数创建一个进程,其创建一个子进程。
pid_t getpid(void);
获取当前进程 ID
pid_t getppid(void);
获取当前进程的父进程 ID
# 创建一个子进程
pid_t fork(void);
# 失败返回-1
# 成功返回:
# 1. 父进程返回子进程的ID(非负)
# 2. 子进程返回 0
1.打印父子进程id
fork getpid getppid的使用
# include<stdio.h>
# include<stdlib.h>
# include<unistd.h>
int main()
{
pid_t pid ;
pid = fork();
if(pid<0)
{
perror("fork error");
}
else if(pid==0)
{
printf("I am child pid =%d my father pid=%d\n",getpid(),getppid());
}
else
{
printf("I am father pid =%d my father pid =%d\n",getpid(),getppid());
}
return 0;
}
2.顺序打印5个进程
通过命令行参数指定创建进程的个数,每个进程休眠 1S 打印自己是第几个被创建的进程。
# include<stdio.h>
# include<stdlib.h>
# include<unistd.h>
int main()
{
pid_t pid;
int i;
for(i=0;i<5;i++)
{
pid =fork();
if(pid==0)
{
break;
}
}
if(5==i)//父进程 等待for结束自己台跳出
{
sleep(5);
printf("I am father\n");
}
else//子进程 提前break跳出 打印
{
sleep(i);
printf("I am %d child \n",i+1);
}
return 0;
}
3.父子进程:
编写一个程序:
pid_t
类型表示进程 ID,但为了表示 -1,它是有符号整型。(0 不是有效进程ID, init最小,为1)
注意返回值,不是 fork
函数能返回两个值,而是 fork
后,fork
函数变为两个,父子需【各自】返回一个。
注:父进程和子进程并发执行
这里有一篇博客写的非常好,转载一下: