20135304刘世鹏——信息安全系统设计基础第十二周总结

一、代码理解

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;

}

【setenv函数的作用?】 
setenv用来在本次函数运行的过程中增加或者修改环境变量。当最后一个参数不为0的时候,原来的内容会被修改为第二个参数所指的内容。

2.env文件夹-environvar.c代码

#include <stdio.h>

int main(void)

{

extern char **environ;

int i;

for(i = 0; environ[i] != NULL; i++)

printf("%s\n", environ[i]);

return 0;

}

【environ变量是什么?】 该变量指向一个叫“environment”的字符串数组。包括USER(登录用户的名字),LOGNAME(与user类似),HOME(用户登录目录),LANG(地域名),PATH等

3.pipe文件夹-consumer.c代码

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <fcntl.h>

#include <limits.h>

#include <sys/types.h>

#include <sys/stat.h>

#define FIFO_NAME "/tmp/myfifo"

#define BUFFER_SIZE PIPE_BUF

int main()

{

int pipe_fd;

int res;

int open_mode = O_RDONLY;

char buffer[BUFFER_SIZE + 1];

int bytes = 0;

memset(buffer, 0, sizeof(buffer));

printf("Process %d opeining FIFO O_RDONLY \n", getpid());

pipe_fd = open(FIFO_NAME, open_mode);

printf("Process %d result %d\n", getpid(), pipe_fd);

if (pipe_fd != -1) {//open函数正常执行

do {

res = read(pipe_fd, buffer, BUFFER_SIZE);

bytes += res;

} while (res > 0);不断地从fifo文件中读取数据,知道==直到数据被读完

close(pipe_fd);

} else {

exit(EXIT_FAILURE);

}

printf("Process %d finished, %d bytes read\n", getpid(), bytes);

exit(EXIT_SUCCESS);

}

【PIPE_BUF的值是多少?】 4096字节

【memset函数用法?】 原型:memset(void *s,int ch,size_t n);将s中前n个字节用ch替换并返回s

【open函数用法?】 
open(const char *pathname,int flags);第一个参数是欲打开的文件路径字符串,第二个参数是打开方式

【FIFONAME是什么?】 
这里需要补充一下fifo的含义,它是一种文件类型,可以通过查看文件stat结构中的stmode成员的值来判断文件是否是FIFO文件。fifo是用来在进程中使用文件来传输数据的,也具有管道特性,可以在数据读出的时候清除数据。

4.pipe文件夹-pipe.c代码

#include    <stdio.h>

#include<stdlib.h>

#include    <unistd.h>

#define oops(m,x)   //当linux系统执行代码遇到问题时,就会报告oops

{ perror(m); exit(x); }

int main(int ac, char **av)

{

int thepipe[2], newfd,pid;

if ( ac != 3 ){//输入的命令长度不等于3

fprintf(stderr, "usage: pipe cmd1 cmd2\n");

exit(1);

}

if ( pipe( thepipe ) == -1 )    //以下是各种错误

oops("Cannot get a pipe", 1);

if ( (pid = fork()) == -1 )

oops("Cannot fork", 2);

if ( pid > 0 ){

close(thepipe[1]);

if ( dup2(thepipe[0], 0) == -1 )

oops("could not redirect stdin",3);

close(thepipe[0]);

execlp( av[2], av[2], NULL);

oops(av[2], 4);

}

close(thepipe[0]);

if ( dup2(thepipe[1], 1) == -1 )

oops("could not redirect stdout", 4);

close(thepipe[1]);

execlp( av[1], av[1], NULL);

oops(av[1], 5);

}

5.forkdemo3.c文件

#include    <stdio.h>

#include<stdlib.h>

#include<unistd.h>

int main()

{

int fork_rv;

printf("Before: my pid is %d\n", getpid());

fork_rv = fork();       /* 创建子进程    */

if ( fork_rv == -1 )        /* 出错的情况下即子进程创建失败   */

perror("fork");

else if ( fork_rv == 0 ){ //子进程的返回值才是0

printf("I am the child.  my pid=%d\n", getpid());

exit(0);

}

else{//父进程执行这段代码

printf("I am the parent. my child is %d\n", fork_rv);

exit(0);

}

return 0;

}

6.testbuf3.c文件

#include <stdio.h>

int main()

{

fprintf(stdout, "1234", 5);

fprintf(stderr, "abcd", 4);

}

【关于fprintf函数】

函数原型:int fprintf(FILE *stram,const char *format,[argument]);第一个参数是文件指针,第二是输出格式,第三个是附加参数列表。也就是说,该函数会根据指定的格式(format)向输出流(stream)中写入数据(argument)。

二、代码执行时的问题

1.argv,env文件夹中的代码可以正常运行。

2.execl1执行

在直接 gcc execl1 -o execl1.2(因为之前已经有execl可执行文件了)之后,系统提示如图。

后来改变方法,先生成.o 文件再生成可执行文件,就可以执行代码了。

通过网上搜索,发现出现这个错误提示是因为使用了第三方库而没有把它的.m文件添加到compile source中去,而是可能只把这些文件copy到当前文件夹里就觉得可以了;这样在直接编译链接执行的时候根本没有自动引用(网上提供的解决方法建立在专门的编写软件基础上,在target--build phases--compile source中添加.m;不过针对我们的情况,可以分步完成以保证最终生成可执行文件)。

3.consumer执行

开始的时候直接gcc consumer.o -o consumer仍然出现上文中的错误。后来删除consumer .o 文件之后分步编译,可以执行。

4.producer.c函数运行

开始的时候,提示有错误。如图。 
后来查询了access函数,发现它的功能是确定文件或者文件夹的访问权限。如果指定的存取方式有效,则返回0;否则返回-1.其中,f_ok只是判断该文件是否存在。而整个函数需要头文件<unistd.h>。加上该头文件之后,代码可以正常编译。

三、代码执行情况

1.一些不停地打印的代码,sigdemo2为例的那些根本停不下来的代码

注:无法停止时,control+c强行停止

2.一些需要等待时间才能出来的代码(含有sleep)

(1)每隔两秒的sigactdemo2.c

(2)每隔30s的watch.sh

3.输入什么就打印什么或执行什么

(1)输入什么就打印什么

(2)输入什么就执行什么

3.没有结果(无输出,只是申请一个20字节的内存大小)

4.发现代码的最后一句打印不出来,自行修改后得到结果

由这个变为最后加上打印OUCH

时间: 2025-01-02 21:22:04

20135304刘世鹏——信息安全系统设计基础第十二周总结的相关文章

20135304刘世鹏——信息安全系统设计基础第四周学习总结

第三章 程序的机器级表示 1.历史观点 GCC C语言编译器以汇编代码的形式产生输出,汇编代码是机器代码的文本表示,给出程序中的每一条指令.x86架构于1978年推出的Intel 8086中央处理器中首度出现,它是从Intel 8008处理器中发展而来的,而8008则是发展自Intel 4004的.8086在三年后为IBM PC所选用,之后x86便成为了个人计算机的标准平台,成为了历来最成功的CPU架构 2.程序编码 机器级程序的格式和行为,定义为指令集体系结构(ISA),它定义了处理器状态.指

20135304刘世鹏——信息安全系统设计基础第九周总结

第十章.系统I/O 一个Unix文件就是一个m个字节的序列:B0,B1,…,BK,…,Bm-1 一.unix i/o 596 Unix I/O:一种将设备优雅地映射为文件的方式,允许Unix内核引出一个简单.低级的应用接口,这使得所有的输入输出都能以一种统一且一致的方式来执行: **1.打开文件:** - 内核返回一个小的非负整数,叫做描述符. -Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符 为0).标准输出(描述符为1).标准错误(描述符为2). 2.改变当前文件位置:

20135304刘世鹏——信息安全系统设计基础第五周学习总结

第四章 处理器体系结构 ISA:一个处理器支持的指令和指令的字节级编码——指令集体系结构 ISA在编译器编写者和处理器设计人员之间提供了一个概念抽象层 与IA32相比Y86指令集的数据类型.指令和寻址方式都要少一些,它的字节级编码比较简单,不过它仍然足够完整 4.1.Y86指令集结构 定义一个指令集体系结构,暴扣定义各种状态元素.指令集和它们的编码.一组编程规范和异常事件处理 1.程序员可见的状态 程序员可见状态:Y86程序中的每条指令都会读取或修改处理器状态的某些部分 Y86的处理器状态类似与

20135304刘世鹏——信息安全系统设计基础第二周学习总结

第一节.Linux基础 1.Linux命令 Linux中命令格式为:command [options] [arguments] 选项:是调整命令执行行为的开关,选项不同决定了命令的显示结果不同 参数:决定了命令的显示结果不同 例如:ls .中.为参数:ls -a中-a为选项 2.man命令 1 Executable programs or shell commands(普通的Linux命令) 2 System calls (系统调用,操作系统的提供的服务接口) 3 Library calls (

20135304刘世鹏——信息安全系统设计基础第一周学习总结

第一节 Linux系统简介 一.Linux是一个操作系统 1. Linux 本身只是操作系统的内核.内核是使其他程序能够运行的基础. 它实现了多任务和硬件管理,用户或者系统管理员交互运行的所有程序 实际上都运行在内核之上. 2. Linux 内核具备了挑战 UNIX 的所有本质特性,包括 TCP/IP 网络,图 形界面系统 二.linux与windows的区别 Linux 免费或少许费用. Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有资金支持,部分软件质量和体

信息安全系统设计基础第十二周总结

exec1 #include <stdio.h>#include <unistd.h> int main(){ char *arglist[3]; arglist[0] = "ls"; arglist[1] = "-l"; arglist[2] = 0 ;//NULL printf("* * * About to exec ls -l\n"); execvp( "ls" , arglist ); pri

信息安全系统设计基础第十二周学习总结

第十二周代码学习 一.environ.c #include <stdio.h> #include <stdlib.h> int main(void) { printf("PATH=%s\n", getenv("PATH")); setenv("PATH", "hello", 1); printf("PATH=%s\n", getenv("PATH")); #if

20135223何伟钦—信息安全系统设计基础第十二周学习总结

一.学习目标 1.掌握进程控制 2.掌握信号处理的方法 3.掌握管道和fifo进行进程间通信的方法 二.学习资源 编译.运行.阅读.理解process.tar.gz压缩包中的代码 三.编译.运行.阅读.理解代码 (1)exec1 execvp函数 表头文件: #include 定义函数: int execvp(const char file ,char const argv []); execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二

信息安全系统设计基础第十二周学习总结-吕松鸿

第十一章 网络编程 11.1客户端—服务器编程模型 1.一个服务器进程 -> 管理某种资源 -> 通过操作这种资源来为它的客户端提供某种服务. 2.一个或多个客户端进程. 3.基本操作:事务 当一个客户端需要服务时,向服务器发送一个请求,发起一个事务. - 服务器收到请求后,解释它,并以适当的方式操作它的资源. 服务器给客户端发送一个相应,并等待下一个请求. 客户端收到响应并处理它. 注意:客户端和服务器都是进程. 11.2网络 (1)对主机而言:网络是一种I/O设备 从网络上接收到的数据从适