首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【翻译】XV6-DRAFT as of September 3,2014 第0章 操作系统接口

在子进程退出之后,父进程的wait也就返回了,于是父进程打印: parent:chlid 1234 is done 注意到父进程与子进程拥有不同的内存空间与寄存器,因此在父进程中改变某个变量的值,并不影响子进程中该变量的值...父进程shell调用wait,子进程执行命令。例如,如果用户输入了echo hello ,runcmd(在8406行)将被调用并以echo hello作为参数,runcmd真正执行了命令。...下面的程序片段(实际上就是cat的本质)从标准输入拷贝数据到标准输出,如果遇到了错误,它会往标准错误中输出错误消息。...文件描述符是一个强大的抽象,因为它隐藏了它所指向的文件的细节:一个向文件描述符1写入数据的进程,可能是写入到文件,写入到设备例如控制台,或者是写入到管道。...管道的右端可能也是一个带有管道的命令(例如 a|b|c),它fork两个新的子进程(一个b,一个c)。

60660
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MIT 6.S081 (BOOK-RISCV-REV1)教材第一章内容 --- 操作系统接口

    例如,考虑下面用C语言编写的程序片段 // fork()在父进程中返回子进程的PID // 在子进程中返回0 int pid = fork(); if(pid > 0) { printf("parent...尽管最初子进程与父进程有着相同的内存内容,但是二者在运行中拥有不同的内存空间和寄存器: 在一个进程中改变变量不会影响到另一个进程。...例如:当wait的返回值存入父进程的变量pid中时,并不会影响子进程中的pid,子进程中pid仍然为0。 exec系统调用使用从文件系统中存储的文件所加载的新内存映像替换调用进程的内存。...主循环使用getcmd函数从用户的输入中读取一行,然后调用fork创建一个shell进程的副本。 父进程调用wait,子进程执行命令。...管道的右端可能是一个命令,该命令本身包含一个管道(例如,a | b | c),该管道本身fork为两个新的子进程(一个用于b,一个用于c)。 因此,shell可以创建一个进程树。

    30621

    java开发操作系统:启动任意多控制台窗口

    当控制台进程可以无限多时,我们原来用于存储进程的数组和控制台图层窗口的数组就没有用了,因此代码要做相应改动,在write_vga_desktop.c中,去掉task_cons数组,换成一个执行控制台进程的指针...当我们点击tab键时,要实现主进程和激活控制台进程的切换,而且当有按键信息输入时,按键内容要传递给当前正在处于激活状态的控制台进程,因此相关代码的修改如下: void CMain(void) {...,需要为其分配代码段和内存段描述符,不同控制台启动的用户进程,必须对应不同的描述符,我们用当前进程的段描述符减去第一个进程的段描述符,然后分别加上21和30后得到的结果作为代码段描述符和内存段描述符的下标...,在控制台输入命令”exit”时,控制台能自我关闭,当控制台执行命令exit时,它会调用函数cmd_exit, 在该函数的实现中,它向主进程发送了一个特别的命令255,这个数值告诉主进程把当前激活的控制台进程给关闭掉...函数,如果由控制台进程来调用close_constask的话,因为它自己把自己给休眠了,那么后面的代码就无法执行了,因此我们对主进程的代码也做相应修改: else if(fifo8_status(&keyinfo

    91710

    【操作】Cobalt Strike 中的权限维持和团队服务器之间的会话传递

    其效果等同于在 Beacon 控制台中输入: shell sc create "WindowsUpdate2" binpath= "cmd /c start "C:\Windows 同样会上线一个 Beacon...使用 ppid 命令将 chrome.exe 设为父进程: 使用 chrome 的64位子进程来作为临时进程用于派生会话: 注:使用 spawn命令来为监听器派生会话,spawn 命令接受两个参数...List 发现此会话进程的确是作为 chrome.exe 的子进程运行的,但是将新派生会话到 chrome.exe 的子进程中失败了,而是开了一个默认的 rundll32.exe。...其实这里一般是用 iexplore.exe 的 x86 子进程作为派生会话的临时进程(使用 spawn x86 c:\program files (x86)\internet explorer\iexplore.exe...在新的团队服务器上开监听自身的 reverse_http 监听器。 在旧的团队服务器上,[Beacon] → spawn → 选择第二步中开的监听器。 会话传递成功,可在新的团队服务器中查看。

    1.4K20

    Linux系统下进程编程之进程状态和守护进程解析(五)

    这三个步骤可以说是环环相扣的(同时在这个过程中,我们要思考所需要的知识,以及如何去索取新的知识,找到切入点)。...()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数comm字符串所代表的命令。...(4)为了保证这一点,我们先调用fork()然后exit(),此时只有子进程在运行 2、创建守护进程的主要步骤: (1)子进程等待父进程退出 (2)子进程使用setsid函数创建新的会话期,脱离控制台...(6)将0、1、2三个文件描述符定位到/dev/null(也就是把这个进程的标准输入、标准输出和标准出错信息全部绑定到/dev/null) 3、示例代码编写: 任何一个进程都可以将自己实现成守护进程...} // 执行到这里就是子进程 // setsid将当前进程设置为一个新的会话期session,目的就是让当前进程 // 脱离控制台。

    97110

    java开发操作系统:不锁死控制台的加载用户进程

    的执行控制器转移到了用户进程的代码,控制台自己的代码无法得到执行,因而被锁死了。...从上图你或许能看出一些‘猫腻’,start 命令的本质是启动一个新的控制台进程,然后把start 后面的字符传给新的控制台,然后再把‘回车’信息传给控制台,这就好像用户在新的控制台中输入相应命令启动进程一样...fifo8_put把start 命令后面字符创中每个字符对应的键盘扫描码输入到该队列中,但是fifo8_put有个副作用,就是当队列受到信息输入时,如果该队列包含的进程对象不为空,那么它一收到信息就会激活队列所包含的进程对象...task_run(fifo->task, -1, 0); return 1; } } return 0; } 如果cmd_start在把信息输入到新控制台进程的队列前...用ncst命令加载的用户进程不会附带一个控制台窗口,那是因为我们在代码中故意不绘制窗口,用户进程启动后,点击回车就可以把进程给结束掉,但有个问题是,当我们用鼠标点击窗体右上角的X按钮时,无法正常关闭窗口

    75720

    PHP守护进程的两种常见实现方式详解

    ,控制台还可以运行其他命令,这时我们还可以通过 fg 命令让进程恢复到普通占用控制台的模式。...首进程以及作为job提交的进程(即用 & 符号提交的进程) 2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程 3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态...[root@localhost php]# nohup php deadloop.php nohup: 忽略输入并把输出追加到"nohup.out" 并且nohup默认会把程序的输出重定向到当前目录下的...chdir('/'); /* 通过上一步,我们创建了一个新的会话组长,进程组长,且脱离了终端,但是会话组长可以申请重新打开一个终端,为了避免 这种情况,我们再次创建一个子进程,并退出当前进程,这样运行的进程就不再是会话组长...】/seif ($pid > 0) { // 再一次退出父进程,子进程成为最终的守护进程 exit(0); } // 由于守护进程用不到标准输入输出,关闭标准输入,输出,错误输出描述符 fclose(STDIN

    47510

    深入了解 Node 的多进程服务

    使用 shell 进行跨进程调用长久以来被认为是不稳定的,这大概源于人们对控制台不友好的交互体验的恐惧(输入命令后,很可能长时间看不到一个输出,尽管后台可能在一直运算,但在用户看来和死机无异)。...; return 5; } 使用 gcc 编译该文件: gcc example.c -o example 生成名为example的可执行文件,然后将这个可执行文件放到系统环境变量中,然后打开控制台...cmd.exe 或者 bin/sh,然后在shell中调用作为参数的命令。...childProcess中定义了如下事件。 Event:'close':进程的输入输出流关闭时会触发该事件。...该进程无法通过kill方法关闭。 无法发送消息给子进程。 Event:'error'事件无法保证一定会被触发,因为可能会遇到一些极端情况,例如服务器断电等。

    76420

    【C++】STL 算法 - transform 变换算法 ( transform 函数原型 | 将 一个 或 两个 输入容器 中的元素 变换后 存储到 输出容器 中 )

    文章目录 一、transform 算法 1、transform 算法简介 2、transform 算法函数原型 1 - 将 一个输入容器 中的元素 变换后 存储到 输出容器 中 3、transform...1 - 将 一个输入容器 中的元素 变换后 存储到 输出容器 中 transform 算法函数原型 : 下面的函数原型作用是 将 一个输入容器 中的元素 变换后 存储到 输出容器 中 ; template...根据 输入元素 的 范围确定 , transform 会将 变换结果存储到 输出容器中 ; UnaryOperation unary_op 参数 : 一元函数对象 , 将输入容器 的 每个元素 输入到该...transform 算法函数原型 2 - 将 两个输入容器 中的元素 变换后 存储到 输出容器 中 transform 算法函数原型 : 下面的函数原型作用是 将 两个输入容器 中的元素 变换后 存储到...binary_op: 二元函数对象 , 将输入容器1 和 输入容器 2 的 每个元素 输入到该 二元函数对象 中 , 将计算结果 输出到 输出容器 中 ; 返回值解析 : 该 算法函数 返回 OutputIt

    72210

    第4阶段——制作根文件系统之分析init进程(2)

    inittab,以及运行inittab文件中的各个子进程 (4) 了解制作一个最小的根文件系统的需求 1.busybox简介 内核启动成功后,建立init进程并执行了第一个应用程序后,我们就可以输入ls...可以发现: 其中ls命令就位于ls.c文件中,cp命令就位于cp.c文件中,同样的init进程就位于init.c文件中 执行这些命令或者进程,最终调用它们自己的文件中xx_main()函数。...所以分析init进程就分析init.c文件中的init_main()函数 3分析busybox中init进程 init_main() init进程:除了启动第一个应用程序(/linuxrc或者/sbin.../console已经设为标准输入输出了,如不设置就等于dev/null,则从控制台输入输出。...,只创建子进程,而action=ASKFIRST时,需要一直等待用户回车才创建子进程 4.通过前面的分析,制作一个最小的根文件系统至少需要: (1)/dev/console(终端控制台, 提供标准输入、

    1.4K90

    UNIX环境高级编程(APUE)之单实例守护进程

    \n", LOCK_FILE, strerror(errno) ); //下面这一行无法打印到控制台,项目上应该打印到日志文件中 printf( "Cannot lock...\n", strerror(errno) ); //下面这一行无法打印到控制台,项目上应该打印到日志文件中 printf( "Daemon process is already...3 创建第一个守护进程 如下图所示,程序先执行第178行main函数中的打印语句,输出当前第一个进程的PID值为25872;然后由于在daemonize函数中第一个进程(PID:25872)退出,所以它的子进程...)打开标准输入/输出/错误流,最后该子进程成为由Linux系统init进程托管的孤儿进程,没有终端terminal,这也就是守护进程。...这时使用cat /var/log/message命令查看进程在Linux系统日志文件中打印的内容,如下图所示: 很显然程序执行到第160行,由于第一个守护进程对LOCK_FILE文件加锁的缘故而无法获取该文件的访问权限最终导致子进程

    12310

    Node写的毕设项目100人并发就撑不住,我是这样解决的

    身为前端,我毫不犹豫选择 Node 作为系统后台——告别庞大的 Java,全方位拥抱灵活的 JS,我对项目前景充满信心。...我开启一次从 0 到 100 递增的 PTS 并发压测,结果如下: 可见从 100 并发开始,就出现了无法忽略的异常请求返回数量,5万请求860个异常,系统已经撑不住了,然后阅读生成的测试报告,发现几乎所有异常都发生在一个接口.../const/childWorker.js"); // 子进程监听父进程的事件,根据message事件附带的data对象中的type属性判断消息类型,如果是密码校验请求,则进行响应校验操作 process.on...其中,bindEvent 方法用于对子进程进行事件监听,定义在事件管理器文件 event-binder.js 中,该文件主要提供两个功能:对子进程进行事件监听、暂存请求的回调函数以便子进程运算完成后调用...通过IPC进程间通信的方式,将状态管理在主进程中,主进程状态改变时,通过IPC通知子进程更新状态,子进程状态改变时,也通过IPC通知主进程同步。 小伙伴如有其他好方法,欢迎评论分享。

    1K10

    windows 多任务与进程

    多任务,进程与线程的简单说明 多任务的本质就是并行计算,它能够利用至少2处理器相互协调,同时计算同一个任务的不同部分,从而提高求解速度,或者求解单机无法求解的大规模问题。...参数中的安全描述符表示的是创建的子进程的安全描述符,与当前进程的安全描述符无关。...,在新的控制台上做输入输出 ZeroMemory(&si, sizeof(STARTUPINFO)); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION...为了区分子进程和父进程的输入输出,一般通过标志CREATE_NEW_CONSOLE为新进程新建一个另外的控制台。...下面是一个重定向的例子: //启动控制台,做输入输出重定向到文件中 TCHAR szFilePath[MAX_PATH + 1] = _T(""); //指定文件对象可以被子进程所继承

    1.2K40

    xv6(19) SHELL交互程序

    $fork$ 会复制一份进程的文件描述符表,所有进程都可以看作是 $init$ 进程的子进程,所以每个进程至少都有三个文件描述符,0、1、2,分别表示标准输入,标准输出,标准错误。...(parsecmd(buf)); //从字符串中解析出命令,然后运行 wait(); //等待子进程退出 这是 $shell$ 的 $main$ 函数一部分,它 $fork$ 出一个子进程运行控制台输入的命令...= 0){ //fork出一个子进程运行右边的命令 close(0); //关闭标准输入 dup(p[0]); //标准输入重定向到p[0...读进程 B** close(0); dup(p[0])**,这就把进程 $B$ 的标准输入重定向到管道的读端。...另外这最后解决前文控制台输入输出一文中遗留的一个问题,为什么在控制台键入 Ctrl + D 会导致 shell 退出,从这里我们看出如果 getcmd 函数返回的值小于 0 的话,那么 shell 就会执行

    39910

    Python Subprocess库详解

    简介 Subprocess库是Python中用于创建和管理子进程的标准库。它提供了一个强大而灵活的接口,使得你可以在Python中启动新的进程、连接它们的输入和输出,并与它们进行交互。...超时处理 在实际应用中,我们可能希望设置子进程的最长运行时间,以避免因子进程无法正常退出而导致父进程一直等待。...子进程信号处理 Subprocess库还允许你在父进程中处理子进程的信号,例如在父进程中捕获子进程的Ctrl+C信号。...在这个例子中,pre_exec_function函数在子进程启动之前被调用,将子进程设置为新的进程组。...在这个例子中,pre_exec_function函数在子进程启动之前被调用,将子进程设置为新的进程组。

    2.5K21

    进程监控工具supervisor 启动Mongodb

    第二,被管理进程作为supervisor的子进程,当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,所以当然也就可以对挂掉的子进程进行自动重启了,当然重启还是不重启,也要看你的配置文件里面有木有设置...Supervisor 也提供参数 "-c" 来指定配置文件的目录路径。 在终端输入 "echo_supervisord_conf" 命令可查看 Supervisor 的默认配置的内容。...:8080 #IP和绑定端口 username = admin #管理员名称 password = 123456 #管理员密码 这样,在浏览器中输入配置中写的地址和端口号,输入配置好的用户名和密码,便可以看到基于网页的控制台界面...首先了解一下supervisor提供的事件,supervisor通过子进程对应用程序进行管理,监控程序同样作为一个子进程运行,子进程的stdin、stdout、stderr都已经被重定向。...事件处理过程如下: 作为监听程序的子进程向stdout写入READY\n 事件发生时,supervisor会选择一个处于Ready状态的子进程的stdin写入事件内容 该子进程事件处理完毕后向stdout

    2.5K60
    领券