1、获取进程ID:getpid
1)函数原型
pid_t getpid(void);
2)所属头文件
#include <sys/types.h>
#include <unistd.h>
3)返回值
一般成功: 返回调用该进程的id.
4)参数说明
无参数
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
void main()
{
int id;
id = getpid();
printf("Process id is %d.\n", id);
}
输出:
[root@localhost multi-process]# ./getpid
Process id is 3557.
2.0、创建进程: fork, 独立数据段和堆栈段
1)函数原型
pid_t fork(void); //创建一个子进程, 复制父进程余下的程序, 父/子进程执行顺序不定
2)所属头文件
#include <unistd.h>
3)返回值
成功: 在父进程中返回子进程的pid
在在进程中返回0.
失败: -1
4)参数说明
无参数
#include <stdio.h>
#include <unistd.h>
void main()
{
pid_t pid = 0;
pid = fork();
if (pid > 0)
{
printf("I love linux: %d\n", pid);
}
else
{
printf("I am fork's child\n");
}
exit(0); //End of process.
}
输出:
[root@localhost multi-process]# ./myfork
I love linux: 3582
I am fork's child
2.1、创建进程: vfork, 共享父进程的数据段和堆栈段.
1)函数原型
pid_t vfork(void); //创建子进程并阻塞父进程, 即子进程先运行.
2)所属头文件
#include <sys/types.h>
#include <unistd.h>
3)返回值
成功: 在父进程中返回子进程的pid
在子进程中返回0
失败: -1
4)参数说明
无参数
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void main()
{
pid_t pid = 0;
pid = vfork();
if (pid > 0)
{
printf("I love linux: %d\n", pid);
}
else
{
printf("I am fork's child\n");
}
exit(0); //End of process.
}
输出:
[root@localhost multi-process]# ./myvfork
I am fork's child
I love linux: 3625
3、退出进程: exit
1)函数原型
void exit(int status);
2)所属头文件
#include <stdlib.h>
3)返回值
无返回值.
4)参数说明
status: 返回给父进程 status & 0377, 退出状态码
4、进程等待: wait
1)函数原型
pid_t wait(int *status);
2)所属头文件
#include <sys/types.h>
#include <sys/wait.h>
3)返回值
成功: 返回终止的子进程ID
失败: -1
4)参数说明
status: 记录子进程的退出状态
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
void main()
{
pid_t pid;
pid = fork();
if (pid > 0)
{
wait(NULL);
puts("I am father process.\n");
exit(0);
}
else
{
puts("I am child. Ha Ha ~~\n");
exit(0);
}
}
输出:
[root@localhost multi-process]# ./mywait
I am child. Ha Ha ~~
I am father process.
5、执行进程: exec
1)函数原型
int execl(const char *path, const char *arg, ...);
2)所属头文件
#include <unistd.h>
3)返回值
成功: 无
失败: 有
4)参数说明
arg: path指向的进程需要的函数(可以有多个), 以NULL结束.
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
void main()
{
pid_t pid = 0;
pid = fork();
if (pid > 0)
{
puts("Father: Hello Linux. \n");
wait(NULL);
exit(0);
}
else
{
execl("./getpid", NULL);
/* 当执行了execl()之后, 余下的代码将不会被执行 */
puts("Child: Goodbye Linux. \n");
exit(0);
}
}
输出:
[root@localhost multi-process]# ./myexec
Father: Hello Linux.
Process id is 3695.
* 注: 这里需要注意的是, 当执行了execl之后, 余下的代码将不会被执行.
# exec和fork的区别:
fork: 创建一个新的进程, 产生一个新的pid.
exec: 保留原有的进程, 执行新的代码.(余下代码不执行 ! )