首页 > 代码库 > 20145321 《信息安全系统设计基础》第十一周学习总结

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与之后一句。

技术分享

本周代码托管

代码托管链接

代码量统计

技术分享

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