20145321 《信息安全系统设计基础》第十一周学习总结

20145321 《信息安全系统设计基础》第十一周学习总结

代码实践

exec1.c

程序代码

 #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 );//第一个参数传递的是文件名
 printf("* * * ls is done. bye");

 return 0;
 }
  • 这个代码中用了execvp函数。execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。

exec2.c

程序代码

 #include <stdio.h>
 #include <unistd.h>
 int main(){
 char    *arglist[3];
 arglist[0] = "ls";
 arglist[1] = "-l";
 arglist[2] = 0 ;
 printf("* * * About to exec ls -l\n");
 execvp( arglist[0] , arglist );
 printf("* * * ls is done. bye\n");
 }
  • 它与exec1的区别就在于exevp函数的第一个参数,exec1传的是ls,exec2直接用的arglist[0],不过由定义可得这两个等价,所以运行结果是相同的。

exec3.c

程序代码

 #include <stdio.h>
 #include <unistd.h>
 int main(){
 char    *arglist[3];
 char*myenv[3];
 myenv[0] = "PATH=:/bin:";
 myenv[1] = NULL;
 arglist[0] = "ls";
 arglist[1] = "-l";
 arglist[2] = 0 ;
 printf("* * * About to exec ls -l\n");
 execlp("ls", "ls", "-l", NULL);
 printf("* * * ls is done. bye\n");
 }
  • 这个代码里使用了execlp函数。 execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。 指定了环境变量,然后依然执行了ls -l指令,成功后没有返回,所以最后一句话不会输出。运行结果同exec1。

forkdemo1.c

程序代码

 #include    <stdio.h>
 #include<sys/types.h>
 #include<unistd.h>
 int main(){
 int ret_from_fork, mypid;
 mypid = getpid();
 printf("Before: my pid is %d\n", mypid);
 ret_from_fork = fork();
 sleep(1);
 printf("After: my pid is %d, fork() said %d\n",
        getpid(), ret_from_fork);
 return 0;
 }
  • 这个代码先是打印进程pid,然后调用fork函数生成子进程,休眠一秒后再次打印进程id,这时父进程打印子进程pid,子进程返回0。

forkdemo2.c

程序代码

 #include <stdio.h>
 #include <unistd.h>
 int main()
 {
 printf("before:my pid is %d\n", getpid() );
 fork();
 fork();
 printf("aftre:my pid is %d\n", getpid() );

 return 0;
 }
  • 这个代码调用两次fork,一共产生四个子进程,所以会打印四个aftre输出。

forkdemo3.c

程序代码

 #include    <stdio.h>
 #include    <stdlib.h>
 #include    <unistd.h>
 int fork_rv;

 int main()
 {

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

 fork_rv = fork();       /* create new process   */

 if ( fork_rv == -1 )        /* check for error  */
    perror("fork");
 else if ( fork_rv == 0 ){
    printf("I am the parent. my child is %d\n", getpid());

    exit(0);
 }
 else{
    printf("I am the parent. my child is %d\n", fork_rv);
    exit(0);
 }

 return 0;
 }
  • fork产生子进程,父进程返回子进程pid,不为0,所以输出父进程的那句话,子进程返回0,所以会输出子进程那句话。

forkdemo4.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();       /* create new process   */
 if ( fork_rv == -1 )        /* check for error  */
    perror("fork");
 else if ( fork_rv == 0 ){
    printf("I am the child.  my pid=%d\n", getpid());
    printf("parent pid= %d, my pid=%d\n", getppid(), getpid());
    exit(0);
 }
 else{
    printf("I am the parent. my child is %d\n", fork_rv);
    sleep(10);
    exit(0);
 }
 return 0;
 }
  • 先打印进程pid,然后fork创建子进程,父进程返回子进程pid,所以输出parent一句,执行sleep(10)语句,休眠十秒。子进程返回0,所以输出child与之后一句。

本周代码托管

代码托管链接

代码量统计

时间: 2024-08-06 11:56:57

20145321 《信息安全系统设计基础》第十一周学习总结的相关文章

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

第八章 异常控制流 控制转移序列称为控制流. 从从一条指令到下一条指令称为转移控制. 异常控制流:现代操作系统通过使控制流发生突变来对系统状态做出反应,这些突变称为异常控制流. 异常控制流ECF:即这些突变. 1.ECF是操作系统用来实现I/O.进程和虚拟存器的基本机制 2.应用程序通过使用一个叫做陷阱或者系统调用的ECF形式,向操作系统请求服务 3.ECF是计算机系统中实现并发的基本机制 4.软件异常机制——C++和Java有try,catch,和throw,C中非本地跳转是setjmp和lo

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

第八章代码学习 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" , argli

信息安全系统设计基础第十一周学习总结—20135227黄晓妍

第8章异常控制流 控制流:控制转移序列. 控制转移:从一条指令到下一条指令. 异常控制流:现代操作系统通过使控制流发生突变来对系统状态做出反应,这些突变称为异常控制流. 一.异常 1.异常的剖析,如下图所示: 异常:控制流中的突变,用来响应处理器状态的某些变化. Icurr:当前指令 事件:状态变化 2.异常处理 异常表:当处理器检测到有事件发生时,它会通过跳转表,进行一个间接过程调用(异常),到异常处理程序. 异常号:系统中可能的某种类型的异常都分配了一个唯一的非负整数的异常号.异常号是到异常

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

一.学习目标 掌握进程控制掌握信号处理的方法掌握管道和fifo进行进程间通信的方法 二.学习任务 编译.运行.阅读.理解process.tar.gz压缩包中的代码 三.参考资料及实验环境 参考资料:process.tar.gz压缩包中的代码. 课本<深入理解计算机系统>. 百度.20135202闫佳歆 环境:实验楼 四.学习过程 exec1 #include <stdio.h>#include <unistd.h> int main(){ char *arglist[3

20135210程涵——信息安全系统设计基础第十一周学习总结

第8章 异常控制流 8.1 异常 异常是ECF的一种,一部分由硬件实现,一部分由操作系统实现.就是位于硬件和操作系统之间的ECF. 异常可以分为四类:中断(interrupt),陷阱(trap),故障(fault),终止(abort). 中断——来自处理器外部的I/O设备的信号的结果. 中断处理程序——异步异常——由处理器外部I/O设备中的事件产生的.同步异常是执行一条指令的直接产物. 中断通过向处理器芯片上的一个引脚发信号(高低电平),并将异常号放在系统总线上,以触发中断,很清楚. 其中断处理

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

第八章 异常控制流 异常及其种类 异常:就是控制流中的突变,用来响应处理器状态中的某些变化. 在处理器中,状态被编码为不同的位和信号.状态变化称为事件.事件可能和当前指令的执行没有关系. 在任何情况下,当处理器检测到有事件发生时,它就会通过一张叫做异常表的跳转表,进行一个间接调用异常,到一个专门设计用来处理这类事件的操作子程序(异常处理程序) 当异常处理程序完成处理后,根据引起异常的事件的类型,会发生以下三种情况中的一种: 1)处理程序将控制返回当前指令,即当事件发生时正在执行的指令. 2)处理

# 2018-2019-1 20165225《信息安全系统设计基础》第一周学习总结

2018-2019-1 20165225<信息安全系统设计基础>第一周学习总结 教材学习内容总结 vim的用法 命令行输入vimtutor即可随时查看: linux系统下文件的转换: gcc hello.c => 编译hello.c源程序,出现a.out文件 gcc -o hello hello.c => 编译hello.c源程序,出现hello文件 od -tc -tx1 hello.c => 按单字节查看文件内容 gcc -E hello.c -o hello.i =&g

20145216 史婧瑶《信息安全系统设计基础》第一周学习总结

20145216 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 Linux基础 1.ls命令 ls或ls .显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略.我们可以用ls -a .显示当前目录中的所有内容,包括隐藏文件和目录.其中“-a” 就是选项,改变了显示的内容.如图所示: 2.man命令 man命令可以查看帮助文档,如 man man : 若在shell中输入 man+数字+命令/函数 即可以查到相关的命令和函数:若不加数字,那man命令默认从数字较

20145311 《信息安全系统设计基础》第一周学习总结

20145311 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 常用的部分命令 CTRL+SHIFT+T:新建标签页,编程时有重要应用: ALT+数字N:终端中切换到第N个标签页,编程时有重要应用: Tab:终端中命令补全,当输入某个命令的开头的一部分后,按下Tab键就可以得到提示或者帮助完成: CTRL+C:中断程序运行 Ctrl+D:键盘输入结束或退出终端 Ctrl+S: 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+A: 将光标移至输入行头,相当于Home键 Ctrl+E

20145216史婧瑶《信息安全系统设计基础》第九周学习总结

20145216史婧瑶<信息安全系统设计基础>第九周学习总结 教材内容总结 第十章 系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 第一节 Unix I/O 这一节涉及到操作系统的基本抽象之一--文件.也就是说,所有的I/O设备都被模型化为文件,而所有的输入输出都被当做对相应文件的读/写.相关的执行动作如下: 1.打开文件: 应用程序向内核发出请求→要求内核打开相应的文件→内核返回文件描述符 文件描述符:一个小的非负整数,用来在后续对此文件的所有操作中标识这个文件.有