20135220谈愈敏--信息安全系统设计基础第十周学习总结
argv
argv文件夹中的主要程序是argtest.c
#include <stdio.h>
#include <stdlib.h>
#include "argv.h"//包含了makeargv.c和freemakeargv.c
int main(int argc, char *argv[]) {
char delim[] = " \t";
int i;
char **myargv;
int numtokens;
if (argc != 2) {//如果输入的命令字符个数不等于2
fprintf(stderr, "Usage: %s string\n", argv[0]);//输出
return 1;
}
if ((numtokens = makeargv(argv[1], delim, &myargv)) == -1) {
fprintf(stderr, "Failed to construct an argument array for %s\n", argv[1]);
return 1;
}
printf("The argument array contains:\n");
for (i = 0; i < numtokens; i++)
printf("%d:%s\n", i, myargv[i]);
execvp(myargv[0], myargv);
return 0;
}
采取了两种运行方法,第一种是用-c将所有.c的文件编译成后缀为.o的文件,然后一起编译成可执行文件。第二种方法我尝试直接将这些所有.c的文件编译成可执行文件,运行结果是一样的,如图是Usage: 命令字符 string
env
environ.c显示PATH环境变量
environvar.c
fifo
生产者和消费者问题
exec
如果执行成功则函数不会返回,执行失败则直接返回-1,打印出“* * * ls is done. bye”,失败原因存于errno中。
exec1/exec2运行结果一样,exec3只是将月份用英文输出。执行的是ls -l命令。
forkdemo
forkdemo1
先是打印进程pid,然后调用fork函数生成子进程,休眠一秒后再次打印进程id,这时父进程打印子进程pid,子进程返回0.
forkdemo2
两次fork()共产生3个子进程,加上父进程总共有4个进程。
forkdemo3
fork产生子进程,父进程返回子进程pid,不为0,所以输出父进程的那句话,子进程返回0,所以会输出子进程那句话。
forkdemo4
先打印进程pid,然后fork创建子进程,父进程返回子进程pid,所以输出parent一句,休眠十秒;子进程返回0,所以输出child与之后一句。
forkgdb
子进程与父进程并发运行,父进程打印是先打印两句,然后休眠一秒,然后打印一句,子进程先打印一句,然后休眠一秒,然后打印两句。
psh
psh1
输入字符串并将其当做命令执行
psh2
对上一个程序的完善:不断产生新的子进程输入字符串命令并执行。
testbuf
testbuf1
testbuf2
这两个程序类似,fflush(stdout)相当于换行
都是先输出hello,然后换行。之后不退出。
testbuf3
在默认情况下,stdout是行缓冲的,他的输出会放在一个buffer里面,只有到换行的时候,才会输出到屏幕。而stderr是无缓冲的,会直接输出。
testpid
获取当前进程pid和当前进程父进程pid
testpp
二维数组越界申请空间。
将代码改为
pp=malloc(20);
即可编译成功。
testsystem
运行时在./testsystem后面加指令会执行相应指令。
system()——执行shell命令,也就是向dos发送一条指令。这里是后面可以跟两个参数,然后向dos发送这两个命令,分别执行。如下图,输入ls和dir两个指令后,可以看到分别执行了。