fork进程创建

来源:互联网 发布:qq空间红人软件 编辑:程序博客网 时间:2024/06/01 10:00

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 等待指定进程结束的函数,当然也可以用于等待子进程

0 0
原创粉丝点击