美文网首页
操作系统复习

操作系统复习

作者: Elaine_Vita | 来源:发表于2020-07-02 18:44 被阅读0次

一、API相关

1.fork()

https://www.cnblogs.com/bastard/archive/2012/08/31/2664896.html

例子1 计数问题

#include <unistd.h>
#include <stdio.h> 
int main () 
{ 
    pid_t fpid; //fpid表示fork函数返回的值
    int count=0;
    fpid=fork(); 
    if (fpid < 0) 
        printf("error in fork!"); 
    else if (fpid == 0) {
        printf("i am the child process, my process id is %d/n",getpid()); 
        printf("我是爹的儿子/n");//对某些人来说中文看着更直白。
        count++;
    }
    else {
        printf("i am the parent process, my process id is %d/n",getpid()); 
        printf("我是孩子他爹/n");
        count++;
    }
    printf("统计结果是: %d/n",count);
    return 0;
}

在fork之后,子进程几乎复制了父进程的所有内容,但有自己独立的寄存器、内存和文件系统,此时父进程和子进程同时都保存了count这个变量,由于这两个进程是相互独立的,所以两个count是各自进程独有的,所以两次打印出的都是1,而不是出现1和2。

例子2 有趣的printf缓冲区

#include <unistd.h>
#include <stdio.h>
int main() {
    pid_t fpid;//fpid表示fork函数返回的值
    //printf("fork!");
    printf("fork!/n");
    fpid = fork();
    if (fpid < 0)
        printf("error in fork!");
    else if (fpid == 0)
        printf("I am the child process, my process id is %d/n", getpid());
    else
        printf("I am the parent process, my process id is %d/n", getpid());
    return 0;
}

执行结果如下:
fork!
I am the parent process, my process id is 3361
I am the child process, my process id is 3362
如果把语句printf("fork!/n");注释掉,执行printf("fork!");
则新的程序的执行结果是:
fork!I am the parent process, my process id is 3298
fork!I am the child process, my process id is 3299

printf的缓冲机制:
当执行printf时,操作系统仅仅是把要输出的内容放入stdout的缓冲区中,并没有实际的写到屏幕上。但是,换行符‘\n’则会立即刷新stdout,从而立刻打印。

运行了printf("fork!")后,“fork!”仅仅被放到了缓冲里,由于fork后子进程的缓冲区复制父进程的缓冲区,因此在子进程stdout缓冲区也保存了fork! 。
而运行printf("fork! \n")后,“fork!”被立即打印到了屏幕上,之后fork到的子进程里的stdout缓冲里不会有fork! 。因此你看到的结果会是fork! 被printf了1次!

相关知识

  • fork系统调用后,实际上产生了两个值,子进程获得的值为0,父进程获得的值为子进程的进程号。
  • 并发性:子进程和父进程的执行顺序不确定,需要由操作系统来进行调度。(concurrency refers to the ability of different parts or units of a program, algorithm, or problem to be executed out-of-order or in partial order, without affecting the final outcome.)
  • 为了子进程在父进程前输出,父进程中可以调用wait()系统调用来等待子进程完成,wait()高级版为waitpid()。
  • 在不清楚fork产生的进程数时,可以画状态机示意图。

2.wait()

  • 请man具体细节:有些时候wait()在子进程退出之前返回

3.exec()

  • 请man具体细节:execl, execlp(), execle(), execv(), execvp(), execvpe()
  • exec()成功后不会返回
  • 环境变量的资料
  • 创建进程强强联手:fork() + exec()

4.signal()/kill()

二、命令

  • ">":重定向
  • "|":[指令1] | [指令2] 指令1输出的内容作为指令2的输入,指令2的结果就会输出到屏幕上。

相关文章

  • 2019-11-14

    复习操作系统,写作业。

  • 2020-01-07

    今天复习了操作系统

  • 2019-11-15

    复习计算机操作系统!

  • 操作系统复习

    摘自《操作系统概念》(高等教育出版社)第七版第一部分 概述1、事件的发生通常通过硬件或软件中断表示。硬件可随时...

  • 操作系统复习

    物理地址和逻辑地址 物理地址:存单元的真正地址。逻辑地址:CPU所生成的地址。例如,你在进行C语言指针编程中,可以...

  • 操作系统复习

    一、API相关 1.fork() https://www.cnblogs.com/bastard/archive/...

  • 操作系统复习

    作业题 操作系统 孟庆昌(第3版)的课后习题 第一章 操作系统引论 8. 解释以下术语:硬件、软件、多道程序设计、...

  • 操作系统复习

    第一章 引论 1、什么是操作系统?定义,特点,功能 定义:操作系统其实是一个软件,是底层复杂多样的硬件和软件操作的...

  • 2018武大软工Unix复习总结

    UNIX期末总复习 (1)什么是操作系统?什么是UNIX操作系统?什么是Linux操作系统?它们之间的关系是怎样的...

  • 操作系统复习3

    整型信号量 信号量定义为一个整型量; 根据初始情况赋相应的值; 仅能通过两个原子操作来访问。 P操作 wait(...

网友评论

      本文标题:操作系统复习

      本文链接:https://www.haomeiwen.com/subject/uctdqktx.html