作業系統實習課(一) -處理程序相關指令介紹-

Slides:



Advertisements
Similar presentations
Linux 环境及 Shell 程序 操作系统实验 1. 二、 Shell 编程与进程通信 常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、
Advertisements

第一單元 建立java 程式.
計算機程式語言實習課.
C语言程序设计 主讲教师 :张群燕 电话:
第1单元 操作系统概论 第一节 绪论 操作系统定义.
行程(process).
第一章 C语言概述 计算机公共教学部.
UNIX的程序與工作控制 程序的定義與特性 程序的建立 相關指令 背景執行 調整程序優先權 signal與kill 工作控制
马志强 软件学院501室 网络应用开发 马志强 软件学院501室
補充: Input from a text file
基于操作系统的编程复习 张玉宏
產生新的程序:fork() (2/4) fork()回傳時,若成功 若fork()失敗,則回傳-1 新子程序將被加入於系統中
Hadoop 單機設定與啟動 step 1. 設定登入免密碼 step 2. 安裝java step 3. 下載安裝Hadoop
Chapter 5 迴圈.
南京天石软件技术有限公司 陈锺 (QQ: Solaris 10 C编程 南京天石软件技术有限公司 陈锺 (QQ:
高级语言程序设计 主讲人:陈玉华.
Visual C++ introduction
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
chapter 1-Introduction
system(const char *string)
JDK 安裝教學 (for Win7) Soochow University
Linux Programming – Process & Signal
第7章 Linux环境编程.
多进程编程.
C語言簡介 日期 : 2018/12/2.
Function.
进程及进程管理 第4章 进程及进程管理.
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
Introduction to the C Programming Language
进程操作.
Process management(程序管理)
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
程式設計實習課(四) ----C 函數運用----
第一單元 建立java 程式.
实验一、进程控制 一、实验目的 1、加深对进程的理解,进一步认识并发执行的实质; 2、分析进程争用资源现象,学习解决进程互斥的方法;
第2章 进程和线程 内容提要: 2.1 进 程 概 念 2.2 进程的状态和组成 2.3 进 程 管 理 2.4 线 程.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
程式結構&語法.
作業系統 第三章 作業系統結構.
CH05. 選擇敘述.
熊博安 教授.
3.5 线程 问题的提出 进程的引入使操作系统得以完成对并发执行的多道程序动态特征的描述和资源共享的管理,因而进程既是调度的基本单位又是资源分配的基本单位。进程所具有的这两个特点构成了程序并发执行的基础,但同时又导致进程切换过程中由于进程映像过大而带来的时空开销。因此,如果系统中创建的进程过多,或进程切换的频率过高,则会使系统效率下降,限制了并发度的进一步提高。
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
C qsort.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
本节内容 文件读写 视频提供:昆山爱达人信息技术有限公司.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
Pthread.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A.
Computer Science & Information Management
实验二:添加Linux系统调用及熟悉常见系统调用
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab4.
查表法&電腦IO Port二進制轉七段顯示器
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
作業系統實習課(二) -Scheduler-Related System Calls-
多重條件選擇敘述
Programming & Language Telling the computer what to do
Chapter 6 函數.
第6章 嵌入式软件开发基础.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
Array(陣列) Anny
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
Introduction to the C Programming Language
Unix指令4-文字編輯與程式撰寫.
《操作系统设计与实现》 Linux系统编程.
Presentation transcript:

作業系統實習課(一) -處理程序相關指令介紹- 助教:鄧執中 Email:steven1991@ares.ee.nchu.edu.tw

處理成序 每個執行中的程式會構成一個處理程序 處理程序包含程式碼、資料、變數、檔案描述子與環境

在終端機內鍵入ps指令可以得到系統處理程序的資料 命令參數: a 顯示所有進程 -a 顯示同一終端下的所有程式 -A 顯示所有進程 c 顯示進程的真實名稱 -N 反向選擇 e 顯示環境變數 f 顯示程式間的關係 -H 顯示樹狀結構 PID(process identifier): 處理程序辨識子,介於2-32768之間。每當一個處理程序啟動便會依序指定 下一個未用的數字。 第1號處理程序為init,他是Linux系統啟動後執行的第一個程式,可以稱他為 處理程序管理者,所有的程序都是由init啟動,因此他也是所有處理程序的 父程序。

處理程序相關指令(exec、fork、waitpid) #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg,..., char * const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[],char *const envp[]); /*對於類 Unix 系統,unistd.h 中所定義的介面通常都是大量針對系統調用的封裝,如 fork、pipe 以及各 種 I/O 原語。*/

Exec使用範例: Char *const ps_argv[]={"ps","-ag",0}; Char *const ps_envp[]={"PATH=/bin:/usr/bin","TERM=console",0}; execel("/bin/ps","ps","-ax",0); execelp("ps","ps","-ax",0); execelv("/bin/ps","ps","-ax",0,ps_envp); execv("/bin/ps",ps_argv); execvp("ps",ps_argv); execve("/bin/ps",ps_argv,ps_envp);

範例(一):execlp #include <unisted.h> #include <stdio.h> #include <stdlib.h> Int main() { printf(“Running ps with execlp\n”); execlp(“ps”,”ps”,”-af”,0); printf(“Done!!\n”); exit(0); } /*exit函數用於结束正在運行的程序,exit函數將參數返回给OS。一般0代表程序正常結束,1 代表不正常。Exit會刪除程序使用的内存空間,同時把錯誤訊息(1)返回給父程序。此函數包含 在<stdlib.h>中。*/

fork:會把原本的程序複製一份,原本的程序成為父程序而複製出的就 是子程序,兩個程序大致相同,但有屬於各自的資料空間、環境變數 與檔案描述子。複製完後都從fork下一行開始執行。 父處理程序呼叫fork會回傳一程序的PID,而子處理程序會回傳0。如果 fork失敗則會回傳-1。(可以看成fork會回傳子處理程序的PID,但此處產生的子處理程序 底下已經沒有其他子處理程序了所以回傳0) 要用到fork我們需要設一個變數來接fork的回傳值。因為fork會回傳PID 所以系統有個專門的int資料型態pid_t,像這種基本系統數據類型包含 在sys/types.h裡。 fork出錯可能有兩種原因:     1.當前的程序數已經達到了系統規定的上限,這時errno的值被設置 為EAGAIN。     2.系統內存不足,這時errno的值被設置為ENOMEM。

殭屍程序<zombie>、<defunct> 當一個子程序已運作完成,還必須等待父程序結束或是父函式使 用wait函式才會真正的結束,在此發生之前子程序會變成僵屍程 序。(父程序不正常結束也會造成殭屍程序的產生) 殭屍程序仍然占用系統資源與處理程序,所以必須阻止他的產生。 當父程序不正常終止,子程序會交給init管理。init會定期重新整 理並把殭屍程序清理乾淨。

範例二(fork): getpid:系統會讀取自身的PID getppid:系統會讀取父程序的PID #include <unistd.h> #include < sys/types.h> #include <stdio.h> int main () { pid_t fpid; int count=0; printf("I am the original process, my process id is %d\n",getpid()); 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"); printf("統計結果是: %d\n",count); return 0; } getpid:系統會讀取自身的PID getppid:系統會讀取父程序的PID

範例三(fork): 1316 1316 5844 1316 第一次fork 5964 5964 我也成為爹了 6008 #include <unistd.h> #include <stdio.h> #include < sys/types.h> int main(void) { int i=0; printf("i son/pa ppid pid fpid\n"); //ppid指當前程序的父程序pid //pid指當前程序的pid, //fpid指fork回傳給當前程序的值 for(i=0;i<2;i++){ pid_t fpid=fork(); if(fpid==0) printf("%d child %4d %4d %4d\n",i,getppid(),getpid(),fpid); else printf("%d parent %4d %4d %4d\n",i,getppid(),getpid(),fpid); } return 0; 1316 第二次fork 5844 1316 第一次fork 5964 5964 我也成為爹了 第二次fork 6008

  以上的範例也有可能出現這個結果WHY? i son/pa ppid pid  fpid     0 parent 2043 3224 3225     0 child  3224 3225    0     1 parent 2043 3224 3226     1 parent 3224 3225 3227     1 child     1 3227    0     1 child     1 3226    0 

Wait:此函式會讓父程式暫停直到他的子處理程序結束,並回傳子程序 的狀態資訊如PID,結束碼等..) 函式原型: #include <> pid_t wait(int *status); 以下為sys/wait.h定義的巨集: WIFEXITED(status) 如果子程序正常结束,回傳一個非零值 WEXITSTATUS(status) 如果WIFEXITED非零,回傳子程序退出碼 WIFSIGNALED(status) 子程序因为捕獲信號而终止,回傳非零值 WTERMSIG(status) 如果WIFSIGNALED非零,回傳信號代碼 WIFSTOPPED(status) 如果子程序被暂停,回傳一個非零值 WSTOPSIG(status) 如果WIFSTOPPED非零,回傳一個信號代碼

範例四(wait): default: message = "This is the parent"; n = 3; exit_code = 0; break; } for(; n > 0; n--) { puts(message); sleep(1); if(pid !=0) { int status; pid_t child_pid; child_pid = wait(&status); printf("Child has finished: PID = %d\n", child_pid); if(WIFEXITED(status)) printf("Child exited with code %d\n", WEXITSTATUS(status)); else printf("Child terminated abnormally\n"); exit (exit_code); #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> int main() { pid_t pid; char *message; int n; int exit_code; printf("fork program starting\n"); pid = fork(); switch(pid) case -1: perror("fork failed"); exit(1); case 0: message = "This is the child"; n = 5; exit_code = 37; break;

pid_t waitpid(pid_t pid,int *status,int options); pid: pid>0:等待程序ID等於 pid的子程序,不管其它已經有多少子程序運行結束退出,只要指定的子 程序還没有结束,waitpid就會一直等下去。   pid=-1:等待任何一個子程序退出,没有任何限制,此時若options設為0則waitpid和wait的作用一樣。  pid=0:等待同一個程序組中的任何子程序,如果子程序已經加入了别的程序組,waitpid不會對 它做任何理會。  pid<-1:等待一個指定程序組中的任何子程序,這個程序組的ID等於pid的絕對值。   options(設為0為不使用): WNOHANG:如果没有任何已終止的程序,它也會立即返回,不會像wait那樣永遠等下去。   WUNTRACED:如果子程序進入暫停執行則馬上返回,但終止狀態不予理會。

習題: 將其中執行echoll取代命令改為第一次執行ls -l、第二次執行ps -a #include <sys/types.h> #include <sys/wait.h> #include "ourhdr.h" char *env_init[]={"USER=unknown","PATH=/tmp",NULL}; int main() { pid_t pid; if((pid=fork())<0) err_sys("fork error"); else if (pid= =0) { if (execle("/home/stevens/bin/echoall","echoll","myarge1","MY ARG2",(char*) 0,env_init)<0) err_sys("execle error"); } if (waitpid(pid, NULL,0)<0) err_sys("wait error"); if ((pid=fork())<0) else if (pid= =0){ if (execlp("echoall","only 1 arg", (char *) 0)<0) err_sys("execlp error"); exit(0);