目录
fork函数
#include <unistd.h> //包含头文件
pid_t fork(void); //函数原型
函数功能:创建一个进程
函数返回值: fork函数调用成功,返回两次。返回值为0,代表当前进程是子进程。返回值非负数(返回的是子进程的经常id号),代表当前进程为父进。程调用失败,返回-1。
代码演示:
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t id;
id = fork(); //创建一个新的进程,返回两次(父进程返回一次,创建的子进程返回一次)
if(id > 0){ //判断是否为父进程
printf("This is father pid%d\n",getpid() );//打印父进程的ID号
}
else if(id == 0){ //判断是否为值进程
printf("This is child pid%d \n",getpid() ); //打印子进程的ID号
}
return 0;
}
vfork函数与fork函数的区别
vfork()函数跟fork一样可以创建进程,与fork函数有什么区别
关键区别一:
vfork 直接使用父进程存储空间,不拷贝。
关键区别二:
vfork保证子进程先运行,当子进程调用exit退出
vfork使用代码演示:
vfork函数的使用:
代码演示:
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
int i;
pid = vfork();
if(pid > 0){
while(1){
printf("father %d\n",getpid());
sleep(2);
}
}else if(pid == 0){
while(1){
printf("child %d\n",getpid());
sleep(2);
i++;
if(i == 3){
exit(-1);
}
}
}
return 0;
}
运行结果:
CLC@Embed_Learn:~/jd2jc$ ./a.out
child 5288
child 5288
child 5288 //vfork函数会等待子进程的退出,在运行,这里子进程运行三次退出,接着父进程运行
father 5287
^C
关于进程的退出:
正常退出
1.Main函数调用return
2.进程调用exit(),标准c库
3.进程调用_exit()或者_Exit(),属于系统调用
补充:1.进程最后一个线程返回 2.最后一个线程调用pthread_exit
异常退出
1.调用abort
2.当进程收到某些信号时,如ctrl+C
3.最后一个线程对取消(cancellation)请求做出响应
收集进程的退出状态wait()函数
代码演示:
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
int i;
pid = fork();
int status;
if(pid > 0){
wait(&status);
printf("status = %d\n", WEXITSTATUS(status) );
while(1){
printf("father %d\n",getpid());
sleep(2);
}
}else if(pid == 0){
while(1){
printf("child %d\n",getpid());
sleep(1);
i++;
if(i == 3){
exit(5);
}
}
}
return 0;
}
运行结果:
./a.out
child 5437
child 5437
child 5437
status = 5
father 5436
father 5436
^C