1.一个问题
当fork的时候,前面提到过fork是复制进程当前的运行环境,创造出一个和他一模一样的进程,那么当我们在终端上创建一个进程的时候为什么创建的不是一个终端呢?
2.exec函数族 PID不会变
①fork函数创建子进程后,子进程一般要调用exec函数以执行另外一个程序。
当进程调用一个exec函数的时候,子进程执行的程序会被替换为新程序,新程序从main函数开始执行,而且exec不创建新的进程,所以不会改变进程号。
exec只是用磁盘上的新程序来代替当前进程的正文段,数据段,堆,栈
NAME
execl, execlp, execle, execv, execvp - 执行某个文件
总览 (SYNOPSIS)
#include <unistd.h>
extern char **environ;
int execl( const char *path, const char *arg, ...);
int execlp( const char *file, const char *arg, ...);
int execle( const char *path, const char *arg , ...,
char * const envp[]);
int execv( const char *path, char *const argv[]);
int execvp( const char *file, char *const argv[]);
描述 (DESCRIPTION)
exec 系列 函数 用 新的 进程 映象 置换 当前的 进程 映象
②使用过程中一定要注意fflush使用
3. demo
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
puts("Begin():");
execl("/usr/bin/date", "date", "+%s", NULL);
perror("execl()");
exit(1);
puts("End()");
return 0;
}
然后我们进行输出重定向
所以要刷新缓冲
4.另外一个demo
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t pid;
puts("Begin()");
fflush(NULL);
pid = fork();
if(pid < 0)
{
perror("fork()");
exit(1);
}
if(0 == pid)
{
execl("/usr/bin/date", "date", "+%s", NULL);
}
wait(NULL);
puts("End()");
return 0;
}