第八章代码测试运行
1:env文件夹-environ.c代码
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("PATH=%s\n", getenv("PATH"));//getenv函数用来取得参数PATH环境变量的值,执行成功则返回该内容的指针
setenv("PATH", "hello", 1);//见下方解释
printf("PATH=%s\n", getenv("PATH"));
#if 0
printf("PATH=%s\n", getenv("PATH"));
setenv("PATH", "hellohello", 0);
printf("PATH=%s\n", getenv("PATH"));
printf("MY_VER=%s\n", getenv("MY_VER"));//版本
setenv("MY_VER", "1.1", 0);
printf("MY_VER=%s\n", getenv("MY_VER"));
#endif
return 0;
}
execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。
返回值:如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
getenv函数
1.获得环境变量值的函数
2.参数是环境变量名name,例如”HOME”或者”PATH”。如果环境变量存在,那么getenv函数会返回环境变量值,即value的首地址;如果环境变量不存在,那么getenv函数返回NULL
setenv函数
1.修改或添加环境变量的函数
2.将name设置成value
2:exec 2与1 运行结果同exec1相同。
exec2与exec1的不同是exevp中第一个参数不一样,exec1是ls,exec2是arglist[0]。
3:exec3与其运行结果一样,调用了execlp函数。
头文件:#include
定义函数:int execlp(const char * file,const char * arg,....);
相关函数:fork,execl,execle,execv,execve,execvp
返回值:如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
这个代码指定了环境变量,然后依然执行了ls -l指令,成功后没有返回,所以最后一句话不会输出。运行结果同exec1。
4:forkdemo1:先打印子进程pid,休息一秒后根据fork()一次调用两次返回的性质,父进程返回子进程pid,子进程返回0。
5:forkdemo2调用两次fork,产生四个子进程,所以会打印四个aftre输出。
6:forkdemo3:调用fork()使得父进程打印子进程pid,子进程打印自身pid。
7:forkdemo4 先打印进程pid,然后fork创建子进程,父进程返回子进程pid,所以输出parent一句,休眠十秒;子进程返回0,所以输出child与之后一句。
8:forkgdb 两个进程依次打印一堆数字,父进程打印是先打印两句,然后休眠一秒,然后打印一句,子进程先打印一句,然后休眠一秒,然后打印两句。
9:testbuf1:依次你输入要执行的指令与参数,回车表示输入结束,然后输入的每个参数对应到函数中,再调用对应的指令。
第一个是程序名,然后依次是程序参数。一个字符串,一个字符串构造参数列表argist,最后在数组末尾加上NULL,将arglist[0]和arglist数组传给execvp。
程序正常运行,execvp命令指定的程序代码覆盖了shell程序代码,并在命令结束之后退出,shell就不能再接受新的命令。
testbuf2:在printf()后使用fflush(stdout)的作用是立刻将要输出的内容输出。
当使用printf()函数后,系统将内容存入输出缓冲区,等到时间片轮转到系统的输出程序时,将其输出。
testbuf3:fprintf作用是格式化输出到流,流可以是文件或标准输入、输出和错误。
fprintf(stderr,"%s",S);fprintf(stdout,"%s",S);printf("%s",S);
三条语句效果基本一致,不同处在重定向时,只有第一条会在屏幕输出,其余都会输出到重定向的文件。
10:testsystem 调用了system函数
头文件:#include<stdlib.h> 定义函数:nt system(char* command);
11:waitdemo1
调用wait函数: 头文件:#include<sys/types.h>
定义函数: pid_t wait(int* status);
返回值:成功则返回子进程pid,失败返回-1,原因存于errno中。
waitdemo2:同waitdemo1相似,区别在于会分三部分打印子进程结束状态值。
12:mkfifo函数 头文件:#include<sys/types.h> #include<sys/stat.h>
定义函数:int mkfifo(const char *pathname,mode_t mode)
返回值:如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
参考资料:20135237 的博客
学习了教材深入了解计算机系统