传智扫地僧课程学习笔记。
vfork有个限制,子进程必须立刻执行_exit或者exec函数,否则程序就会挂掉,
fork子进程拷贝父进程的数据段
Vfork子进程与父进程共享数据段;
Vfork和exec函数族在一起
execve替换进程映像(加载程序)注意execve是一个系统调用;
替换意味着:代码段、数据段、堆栈段、进程控制块PCB全部替换,#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <signal.h>
/*
{
"aaaa",
"bbbb"
null 0 \0
}
*/
int main01(void )
{
pid_t pid;
int ret = 0;
printf("befor fork pid:%d \n", getpid());
int abc = 10;
pid = vfork(); //errno
if (pid == -1)
{
//printf("pid < 0 err.\n");
perror("tile");
return -1;
}
if (pid > 0)
{
printf("parent: pid:%d \n", getpid());
}
else if (pid == 0)
{
printf("child: %d, parent: %d \n", getpid(), getppid());
//printf("abc:%d\n", abc);
//把自己写应用程序启动起来
//
ret = execve("./hello", NULL, NULL);
if (ret == -1)
{
perror("execve:");
}
printf("execve 测试有没有执行\n");
exit(0);
}
printf("fork after....\n");
return 0;
}
int main(void )
{
pid_t pid;
int ret = 0;
printf("befor fork pid:%d \n", getpid());
int abc = 10;
pid = vfork(); //errno
if (pid == -1)
{
//printf("pid < 0 err.\n");
perror("tile");
return -1;
}
if (pid > 0)
{
printf("parent: pid:%d \n", getpid());
}
else if (pid == 0)
{
printf("child: %d, parent: %d \n", getpid(), getppid());
//printf("abc:%d\n", abc);
//把自己写应用程序启动起来
//通过一个应用程序执行命令
char *const argv[] = {"ls", "-l", NULL};
ret = execve("/bin/ls", argv, NULL);
if (ret == -1)
{
perror("execve:");
}
printf("execve 测试有没有执行\n");
exit(0);
}
//printf("fork after....\n");
return 0;
}