进程
进程
在
进程创建
fork
首先来看下如何创建新的进程,这里需要用到<sys/types.h>
和 <unistd.h>
头文件,函数的返回类型为
void get_pid()
{
pid_t pid;
if ((pid=fork())<0)
{
printf("fork error\n");
exit(1);
}
else if(pid == 0)
{
printf("the pid is %d\n, gvar=%d,var=%d\n",pid,gvar,var);
printf("in the child process!\n");
}
else
{
printf("the pid is %d\n, gvar=%d,var=%d\n",pid,gvar,var);
printf("in the parent process!\n");
}
exit(0);
}
// the pid is 3738in the parent process!
// the pid is 0in the child process!
从结果可以看到返回了两条打印,分别是父进程和子进程。原因在于调用
资源复制
在开发过程中,可以根据返回值的不同,对父进程和子进程执行不同的代码。我们来把代码变动下来看下父进程和子进程的关系。增加了一个全局变量
int gvar=2;
void get_pid()
{
pid_t pid;
int var=5;
if ((pid=fork())<0)
{
printf("fork error\n");
exit(1);
}
else if(pid == 0)
{
gvar--;
var++;
printf("the pid is %d, gvar=%d,var=%d\n",pid,gvar,var);
printf("in the child process!\n");
}
else
{
printf("the pid is %d, gvar=%d,var=%d\n",pid,gvar,var);
printf("in the parent process!\n");
}
exit(0);
}
运行结果,在子进程中,对
// the pid is 4694, gvar=2,var=5 in the parent process!
// the pid is 0, gvar=1,var=6 in the child process!
vfork
除了
int get_pid__vfork()
{
pid_t pid;
int var =5;
printf("process id:%d\n",getpid());
printf("gvar=%d var=%d\n",gvar,var);
if((pid=vfork())<0)
{
printf("error");
return 1;
}
else if(pid == 0)
{
gvar--;
var++;
printf("The child process id:%d\n gvar=%d var=%d\n",getpid(),gvar,var);
exit(0);
}
else
{
printf("the pareent process id:%d\n gvar=%d var=%d\n",getpid(),gvar,var);
return 0;
}
}
执行结果:
process id:4821
gvar=2 var=5
The child process id:4822
gvar=1 var=6
the pareent process id:4821
gvar=1 var=6
脚本执行
在
void main(int argc,char* argv[]) {
execve("test2",argv,environ);
}
int main() {
puts("welcome!");
return 0;
}
首先编译这
进程等待
进程等待就是为了同步父进程和子进程。等待调用
oid exit_s(int status)
{
if(WIFEXITED(status)){
printf("normal exist,status=%d\n",WEXITSTATUS(status));
}
else if(WIFSIGNALED(status)){
printf("signal exit!status=%d\n",WTERMSIG(status));
}
}
void wait_function_test()
{
pid_t pid,pid1;
int status;
int ret;
int pr;
if((pid=fork())<0)
{
printf("child process error!\n");
exit(0);
}
else if(pid == 0)
{
printf("the pid of child is %d\n",getpid());
printf("The child process\n");
sleep(3);
exit(2);
}
else
{
printf("the pid of parent is %d\n",getpid());
printf("I am waiting for child process to exit\n");
pr=wait(&status);
if (pr > 0){
printf("I catched a child process with pid of %d\n",pr);
}
exit_s(status);
}
}
在子进程中调用
-
WIFEXITED:当子进程正常退出时,返回真值
-
WEXITSTATUS:返回子进程正常退出时的状态。只有当
WIFEXITED 为真值的时候。 -
WTERMSIG:用于子进程被信号终止的情况。返回此信号类型