在linux中,可以用以下函数结束正在运行的进程。
>> exit函数—库函数
#include <stdlib.h>
void exit(int value);
参数:value是返回给父进程的参数,低8位有效。
>> _exit函数—系统调用
#include<unistd.h>
void _exit(int value);
参数:value是返回给父进程的参数,低8位有效。
exec:启动一个程序,用这个程序将当前进程的内容替换掉。
fork和vfork函数的区别:
>> vfork保证子进程先运行,在它调用exec或exit之后,父进程才可能被调度运行。
当子进程执行的时候,父进程是挂起的。
实例对比,先是fork的代码:
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(){
pid_t pid;
pid = fork();
if(pid < 0){
perror("vfork error.\n");
}else if(pid == 0){
int i = 0;
for(i = 0;i < 3;i++){
printf("this is child process.\n");
sleep(1);
}
_exit(1);
}else{
int i;
for(i = 0;i < 5;i++){
printf("this is father process.\n");
sleep(1);
}
}
return 0;
}
编译和执行结果如下:
将其中的fork函数替换为vfork之后如下:
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(){
pid_t pid;
pid = vfork();
if(pid < 0){
perror("vfork error.\n");
}else if(pid == 0){
int i = 0;
for(i = 0;i < 3;i++){
printf("this is child process.\n");
sleep(1);
}
_exit(1);
}else{
int i;
for(i = 0;i < 5;i++){
printf("this is father process.\n");
sleep(1);
}
}
return 0;
}
编译和执行结果如下:
>> vfork和fork一样都创建一个子进程,但它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit),于是也就不访问该地址空间。相反,在子进程调用exec或exit之前,它在父进程的地址空间中运行,在exec之后子进程会有自己的进程空间。即共用父进程的资源。
下面的例子可以看出,在子进程中改变全局变量的值,等子进程exit之后,父进程中同名变量的值已经被更改,因为两个指向的是同一个地址。
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int num = 10;
int main(){
unsigned int var = 2;
pid_t pid;
pid = vfork();
if(pid < 0){
perror("vfork error.\n");
}else if(pid == 0){
int i = 0;
for(i = 0;i < 3;i++){
num++;
var++;
printf("in child process: num = %d,var = %d.\n",num,var);
sleep(1);
}
_exit(1);
}else{
printf("in father process: num = %d,var = %d.\n",num,var);
}
return 0;
}
编译和执行结果如下: