编写评测过程零碎知识点
1.lua gettable pushstring
先pushstring压住键值 此时栈中有键值和table
然后gettable(L , -2)从table中获取值并覆盖掉键值放入栈中
之后从-1的栈顶获取值进行操作pop
2.seccomp
seccomp限制fork不会影响到execve
3.linux内核
1.关于fork
fork()用于创建子进程
fork()的返回值有以下三种:
a)在父进程中,fork() 返回新创建子进程的 PID;
b)在子进程中,fork() 返回0;
c)如果 fork() 调用出错,则返回负值
2.关于wait
wait是进程相关,当父进程调用wait后会立刻阻塞自己,子进程中如果有结束的就收集子进程的消息并销毁,没有就将阻塞在这
四种wait wait() waitpid() wait3() wait4()
wait()会等待所有子进程的消息
waitpid(pid_t,*status,options)
pid_t<-1 等待进程组ID等于|pid|的子进程
pid_t=-1 等待任何子进程
pid=0 等待当前进程的任何子进程
pid>0 等待任何子进程ID为pid的子进程
options:

waitpid() 返回值
a) 正常返回时,waitpid()返回子进程pid
b) 调用出错返回-1
c) 设置了WNOHANG的情况下如果没有结束的进程会返回0
wait3()wait4()

3.phread_
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg);
创建线程
4.dup2
参考的博客
用于输入输出的重定向

例如原本有printf("%d",i);
应当输出到终端里
我们将STDOUT_FILENO指向文件,那将输出重定向到文件里了
newfd原本是终端,执行dup2后终端输出关闭,并且将oldfd的fd赋值给了newfd使得输出到了文件中
5.execve
execve我弄的不是很清,我遇到的问题是相当多的
execve 会保留setuid之后的uid
第一个参数传可执行文件或python/java的解释器路径
第二个参数,传一个以空字符结尾的字符指针数组的指针,以NULL结尾,按照惯例,第一个元素应该是执行程序的名称
第三个参数,环境变量
比如运行python类型文件:
argv[]={"python","./helloworld.py",NULL};//解释器路径的名称+参数
execve("/usr/bin/python3",argv,envp);
运行c的二进制文件
argv[]={"helloword",NULL};//可执行文件的名称,这里直接传NULL也行
execve("./helloworld",argv,envp);//
运行会直接覆盖掉原进程,然后若运行失败会有返回值-1

浙公网安备 33010602011771号