文件描述符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 0; 27 }
子进程改变了父进程的值(改变了父进程看到的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),父进程被调度
安心下来做技术,笑是最大的福气