目录
一、产生一个进程的三种方法
1、运行一个可执行文件
./a.out
2、运行一个命令
cp a.txt b.txt
3、在一个程序中调用一个函数 fork ()
#include <sys/types.h>
#include <unistd.h>函数原型:
pid_t getpid(void);
pid_t getppid(void);
返回值:
获取到的父进程或者自己的ID
二.进程的应用
使用两个进程进行数数,一秒数一个,比如父进程从1-100,子进程100-1
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
int num = 0 ;
// 产生一个子进程
pid_t pid = fork( );#子进程返回0,父进程返回ID
if (pid > 0 ) // 当前为父进程
{
printf("我是你大爷 !!我孙子的ID 是:%d \n" , pid );#为子进程的id
for (num = 1; num <= 100 ; num++)
{
printf("num:%d\n" , num );
sleep(1);
}
}
else
{
printf("我是你 二大爷 我自己的ID 是:%d !!\n" , getpid() );#getpid()为自己的id
for (num = 100; num >= 1 ; num -- )
{
printf("num:%d\n" , num );
sleep(1);
}
}
return 0;
}
pid_t pid = fork( ):子进程返回0,父进程返回ID
getpid()#自己的id
getppid()#获取父进程的id
三.linux中的相关命令
1.查看进程号
ps -ef
四.父进程和子进程的异同
(1)父进程和子进程的相同
父子进程的以下属性在创建之初完全一样,子进程相当于搞了一份复制品:
A) 实际 UID 和 GID,以及有效 UID 和 GID。
B) 所有环境变量。
C) 进程组 ID 和会话 ID。
D) 当前工作路径。除非用 chdir()加以修改
E) 打开的文件。
F) 信号响应函数。
G) 整个内存空间,包括栈、堆、数据段、代码段、标准 IO 的缓冲区等等。
(2)父进程和子进程的不同
而以下属性,父子进程是不一样的:
A) 进程号 PID。PID 是身份证号码,哪怕亲如父子,也要区分开。
B) 记录锁。父进程对某文件加了把锁,子进程不会继承这把锁。
C) 挂起的信号。这些信号是所谓的“悬而未决”的信号,等待着进程的响应,子进程 也不会继承这些信号。