fork创建子进程,fork函数返回两个值,当为0时,则认为是子进程代码块执行区域,而不为0则是父进程代码块执行区域。我们需要知道的是,fork子进程可以与父进程共享部分进程上下文,而与此不同的是execl函数,一旦开始执行到execl函数时,启动被调用的函数,后面的代码则不再执行,而是直接执行调用的程序,上下文也被替换。

#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
int errno;
extern char **environ;
int main()
{
printf("开始创建临时文件\n");
//execl("/usr/bin/gedit","gedit","/home/john/Desktop/process/makefile",(char * )0);
char mm[]="tmp-XXXXXX";
char* sfd=mktemp(mm);
int status;
if(NULL==sfd)
{
printf("创建临时文件失败\n");
exit(0);
}
printf("临时文件成功建立\n");
pid_t nChild={0};
int fd=open(sfd,O_CREAT|O_RDWR|O_TRUNC,0644);
if(0==(nChild=fork()))
{
printf("获得子进程ID:%d\n",getpid());
printf("获得父进程ID:%d\n",getppid());
if(write(fd,"123",3)>0)
{
printf("child恭喜写入成功\n");
}
lseek(fd,0,SEEK_SET);
//开始读取文件
char buf[1024]={0};
if(read(fd,buf,1024)>=0)
{
printf("child文件内容是:%s\n",buf);
}
close(fd);
}
else
{
printf("获得当前进程ID:%d\n",getpid());
printf("获得子进程ID:%d\n",nChild);
if(write(fd,"dsa",3)>0)
{
printf("恭喜写入成功\n");
}
lseek(fd,0,SEEK_SET);
char buf[1024]={0};
if(read(fd,buf,1024)>=0)
{
printf("获得文件内容是:%s\n",buf);
}
close(fd);
}
wait(&status);
close(fd);
}


继续说说临时文件的过程,mktemp函数,需要返回一个系统指定的文件名称,然后我们使用该文件名称,进行正常的文件读写。


wait()函数使父进程暫停执行,直到它的一个子进程,注意这里说的是一个 子进程   只要一个就可以结束为止,该函数的返回值是终止运行的子进程的PID. 参数status所指向的变量存放子进程的退出码,即从子进程的main函数返回的值或子进程中exit()函数的参数。如果status不是一个空指针,状态信息将被写入它指向的变量


waitpid 等待指定进程结束的函数,当然也可以用于等待子进程