系统调用open(打开),read(读),write(写),close(关闭)
库函数fopen,fgets,fread...
PCB:进程控制块==进程描述符(Linux系统)==struct task_struct(内核中);
先fork再open,彼此偏移量不受影响。如下图:
先open一个文件在fork父子进程共享一个偏移量。父进程打开文件fork后,子进程也可以访问,并且共享文件偏移量。如下图:
默认有三个文件打开,标准输入stdin(0),标准输出stdout(1),标准错误输出stderr(2).
延伸:输出?BAA
先将A写入缓冲区,write将B打入屏幕,此时复制进程(缓冲区A被复制),此时进程结束,缓冲区两个AA被打出。
系统调用的执行过程:系统调用在内核中。
进程复制fork,进程替换exec系列 execl execlp execle execv execvp(库函数) execve(系统调用)
进程替换:先复制后替换。只有pid不变。fork+exec()
execl在替换时,执行成功不返回。一般都是fork和exec一起使用。
exec使用示例:
execl(“/usr/bin/ps”,“ps”,“-f”,(char*)0); //execl(“程序打开”,“替换程序名”,参数...),系统自己写入环境变量,不用手动输入。
execlp(“ps”,“ps”,“-f”,(char*)0) ;//execl(“程序打开路径”,“替换程序名”,参数...),不用给出路径,系统自己查找,系统自己写入环境变量,不用手动输入。
execle(“/usr/bin/ps”,“ps”,“-f”,(char*)0,envp); //execl(“程序打开路径”,“替换程序名”,参数...,环境变量),要手动写入环境变量
char*myargv[10]={"ps","-f"};
execv(“/usr/bin/ps”,myargv); //execl(“程序打开路径”,参数...)
char*myargv[10]={"ps","-f"};
execvp(“ps”,myargv); //execl(“程序打开路径”,参数...)
char*myargv[10]={"ps","-f"};
execve(“/usr/bin/ps”,myargv,envp) //execl(“程序打开路径”,参数...,环境变量),要手动写入环境变量