以下代码调用execve函数实现创建一个子进程,在子进程中执行另一个文件。
代码3-6 file
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
extern char **environ;
int main(void)
{
puts("welcome to qst");
return 0;
}
代码3-5 execve
在运行结果中,只输出了“welcome to qst”,说明在execve.c这个程序中执行了file.c中的代码。而“正常情况下无法输出此信息”没有正常输出,是因为调用execve函数后,修改了原来的进程中的代码段、数据段和堆栈段。使新创建的子进程只执行新加载的程序代码,而与原来的父进程没有任何关系。
代码3-3
vfork.c
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int gvar = 2;
int main(void)
{
pid_t pid;
int var = 5;
printf("process id:% ld\n",(long)getpid());
printf("gvar=% d var % d\n",gvar,var);
if ((pid=vfork())<0)
{
perror("error!");
return 1;
}
else if (pid ==0)
{
gvar--;
var++;
printf("the child process id:% ld\ngvar=%d\
var=%d\n",(long)getpid(),gvar,var);
_exit(0);
}
else
{
printf("the parent process id:% ld\ng\
var = % d var= %d\n",(long)getpid(),gvar,var);
return 0;
}
}
结果为:
代码3-2
fork1.c
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main(void)
{
printf("befor fork the pid is %d \n",getpid());
pid_tpid;
pid=fork();
printf("after fork the pid is % d \n",getpid());
if (pid == -1)
{
perror("process creation failed \n ");
}
else if (pid == 0)
{
printf("Child Process is runing, childPid is % d \n",getpid());
}
else if (pid>0)
{
printf("Parent process is running, ChildPid is % d,ParentPid is % d\n",pid,getpid());
}
return 1;
}
没结果!有bug…