文件描述符fd文件指针fp和vfork()

Posted JN-PDD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件描述符fd文件指针fp和vfork()相关的知识,希望对你有一定的参考价值。

1.

  fd:在形式上是一个非负整数.实际上他是一个索引值、指向kernal为每一个进程所维护的该进程打开文件的记录表.

    当程序打开一个文件或者创建一个新文件的时候kernal向进程返回一个文件描述符。

  优点:兼容POSIX标准,许多系统调用都依赖于它;缺点:不能移植到unix之外的系统上去

  fp:FILE*指针变量标识符

  优点:是C语言的通用格式,便于移植

 

 

2.

  vfork:使用方法同fork差不多,也适用于创建子进程

  vofork特点:

    1)在子进程调用exec或exit之前,它在父进程的空间里运行,会改变父进程的数据段、栈和堆

eg:      

 int  g_val=0;
  9 int main()
 10 {
 11         pid_t id=vfork();
 12         if(id<0){
 13                 perror("vfork");
 14                 return 1;
 15         }
 16         else if(id==0){//child
 17                 g_val=100;
 18                 printf("child:pid:%d ppid:%d,g_val:%d,&g_val:%p\\n",\\
 19                         getpid(),getppid(),g_val,&g_val);
 20                 exit(1);
 21         }
 22         else{
 23                 printf("father:pid:%d,ppid:%d,g_val:%d,&g_val:%p\\n",\\
 24                         getpid(),getppid(),g_val,&g_val);
 25         }
 26        return 027 }

子进程改变了父进程的值(改变了父进程看到的g_val)

    2)vfork保证子进程先运行 ,在调用了exec()或者exit()之后,父进程才可能被调度运行

     pid_t id=vfork();
 12         if(id<0){
 13                 perror("vfork");
 14                 return 1;
 15         }
 16         else if(id==0){//child
 17                 //g_val=100;
 18                 printf("child:pid:%d ppid:%d\\n",\\
 19                         getpid(),getppid());
 20                 sleep(3);                                //让子进程先等待3秒再调用exit
 21                 exit(1);
 22         }
 23         else{
 24                 printf("father:pid:%d,ppid:%d\\n",\\
 25                         getpid(),getppid());
 26         }

 

结果是:子进程打印,等待3秒(调用了exit),父进程被调度

 

以上是关于文件描述符fd文件指针fp和vfork()的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件描述符(int fd)转换为文件指针(FILE * fp)

文件描述符与文件指针的关系与区别

Linux中文件描述符fd和文件指针flip的理解

标准文件IO详解---fclose函数详解

linuxfile两次读

从内核空间中的文件指针获取 fd