linux中exec*为加载器,可以将程序加载到内存。
main()函数也是函数,也要被调用,也要被传参
故在一个程序中exec*系列的函数先被执行
程序替换中execve是系统调用,其他的都是封装。
进程程序替换
1.创建子进程的目的?
a.想让子进程执行父进程代码的一部分
b.想让子进程执行一个全新的程序
一个简单的命令行解释器
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<assert.h>
#define NUM 1024
char lineCommand[NUM];
#define OPT_NUM 64
char* myargv[OPT_NUM];
int main()
{
while(1)
{
printf("用户名@主机名 当前路径#");
fflush(stdout);
char* s=fgets(lineCommand,sizeof(lineCommand)-1,stdin);
assert(s!=NULL);
(void)s;
lineCommand[strlen(lineCommand)-1]=0;
//printf("test:%s\n",lineCommand);
//字符串切割
myargv[0]=strtok(lineCommand," ");
int i=1;
while(myargv[i++]=strtok(NULL," "));
#ifdef DEBUG
for(int i=0;myargv[i];i++)
{
printf("myargv[%d]:%s\n",i,myargv[i]);
}
#endif
//执行命令
pid_t id=fork();
assert(id!=-1);
if(id==0)
{
execvp(myargv[0],myargv);
}
waitpid(id,NULL,0);
}
return 0;
}
4.撤销与恢复
-
撤销语法::u //键盘输入符号:和字母u再回车(属于末行模式),撤销上一步操作
-
恢复语法:ctrl+r //键盘ctrl+r,恢复撤销操作(即取消之前的撤销操作)
vim中批量化注释
ctrf+v+I+esc
1,对文件操作的本质,进程对文件的操作
2.一个文件要被访问,就必须先被打开。
一个文件被形成的时候有默认文件掩码,普通文件以666作为起始权限,666&~umask可以的到最终权限。
目录默认:777 普通文件默认666
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#define FILE_NAME "log.txt"
int main()
{
//r,w,r+(对文件进行读写操作,不存在则报错),w+(读写,不存在则创建),a(append,追加),a+()
//FILE* fp=fopen(FILE_NAME,"a");
//if(fp==NULL)
//{
// perror("fopen");
// return 1;
//}
//
//
//int cnt =5;
//while(cnt)
//{
// fprintf(fp,"%s:%d\n","hello file",cnt--);
//}
//fclose(fp);
return 0;
}
对文件进行一些基础操作。
O_WRONLY|对文件进行写入
O_CREAT,0666 控制文件的权限
|O_TRUNC 每次以写的形式打开文件,文件对自动清空
O_APPEND 追加
文件操作的本质:进程和被打开文件的关系。
一个进程可以打开多个文件,系统中存在大量被打开的文件,被打开的文件会被OS管理起来,
管理的形式为先描述在组织,操作系统为了管理对应的打开文件,会为文件创建对应的内核数据结构标识文件,struct_file{}中包含了文件的大部分属性。
三个标准输入输出流:
stdin:->键盘
stdout:->显示器
stderr:->显示器
./myfile
stdin->fd: 0
stdout->fd: 1
stderr->fd: 2
fd:3
stdin:->键盘
stdout:->显示器
stderr:->显示器 默认占用文件描述符的0,1,2其他文件从3开始
FILE* fp=fopen();
FILE是一个结构体,结构体中必有一个字段->文件描述符。
进程的文件描述符表:
struct file* fd array[]
进程文件描述符表。
文件描述符的本质是数组下标。
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<assert.h>
#define FILE_NAME(number)"log.txt"#number
int main()
{
printf("stdin->fd: %d\n",stdin->_fileno);
printf("stdout->fd: %d\n",stdout->_fileno);
printf("stderr->fd: %d\n",stderr->_fileno);
umask(0);
int fd0 = open(FILE_NAME(1),O_WRONLY|O_CREAT|O_APPEND,0666);
//int fd=open(FILE_NAME,O_WRONLY|O_CREAT|O_TRUNC,0666);
//if(fd<0)
//{
// perror("open");
// return 1;
//}
printf("fd:%d\n",fd0);
close(fd0);
//r,w,r+(对文件进行读写操作,不存在则报错),w+(读写,不存在则创建),a(append,追加),a+()
//FILE* fp=fopen(FILE_NAME,"a");
//if(fp==NULL)
//{
// perror("fopen");
// return 1;
//}
//
//
//int cnt =5;
//while(cnt)
//{
// fprintf(fp,"%s:%d\n","hello file",cnt--);
//}
//fclose(fp);
return 0;
}