1.0.12是什么

linux-0.12目录为修改过的源代码,其中加入了中文注释,修改部分代码使其能在现在的环境下编译,并且支持GDB调试

文件类型,判断什么类型,比如可执行文件是什么类型

  1. 目录文件
  2. 字符设备文件
  3. 块设备文件
  4. 常规文件
  5. 管道文件
  6. 符号连接文件
  7. 套接字文件

信号发送函数

  1. //函数声明 ppt格式
  2. extern int pthread_kill(pthread_t pthreadid, int signo)
  3. //课本格式 P238
  4. int kill(_pid_t _pid, int _sig)
  5. //_pid:线程id
  6. /*
  7. pid > 0 :发送给pid值位pid的进程
  8. pid = 0 :发送给和当前进程在同意进程组的所有进程
  9. pid = -1 : 发送给系统内调用者可以发送信号的所有进程
  10. _sig:信号
  11. 如果signo为0,就会进行错误检查而不发送信号,成功完成后就会返回0,如果检查出错误,则会返回一个错误编号
  12. //

管道文件创建函数

  1. extern int pipe(int pipdes[2]);
  2. /*
  3. 此函数会将两个整型文件描述于_pipeds[0](读)和_pipeds[1](写)中,他们分别指向管道的两端,如果系统调用失败,将返回-1
  4. */

用户态空间印象,堆栈代码数据每部分功能,生命周期

linux复习 - 图1
代码区(text segment)。加载的是可执行文件代码段
全局初始化数据区/静态数据区(Data Segment)。加载的是可执行文件数据段
未初始化数据区(BSS)。加载的是可执行文件BSS段
堆区(heap)。用于动态内存分配。堆在内存中位于BSS区和栈区之间
栈区(stack)。由编译器自动分配释放,存放函数的参数值、返回值、局部变量等

ipc机制有哪几种

信号队列,信号量通信机制,共享内存

tcp与udp的区别

tcp和udp的编程实现(编程题)

  1. //server端代码
  2. int main(){
  3. int pid;
  4. int sockfd; //socket file describtion 套接字文件描述符 , 指代套接字文件的标号
  5. int new_fd;//接受到请求的套接字
  6. socketlen_t len;//套接字的长度
  7. struct sockaddr_in my_addr, their_addr;//套接字地址结构体
  8. unsigned int myport = 7575;
  9. unsigned int lisnum = 5;//最大监听数
  10. char buf[MAX_BUF + 1];//接受消息的buf
  11. if((sockfd = socket(AF_INET ,SOCK_STREAM , 0)) == -1){ //创建socket对象
  12. perror("socket");
  13. exit(EXIT_FALLURE);
  14. }
  15. bzero(&my_addr, sizeof(my_addr));
  16. my_addr.sin_family = AF_INET; //设置协议
  17. my_addr.sin_port = htons(myport);//设置port
  18. my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//设置ip
  19. //套接字地址与socket对象绑定
  20. if(bind(sockfd,(struct sockaddr *) &my_addr , sizeof(struct sockaddr))==-1){
  21. perror("bind");
  22. exit(EXIT_FAILURE);
  23. }
  24. //监听
  25. if(listen(sockfd,lisnum)==-1){
  26. perror("listen");
  27. exit(EXIT_FAILURE);
  28. }
  29. printf("wait for connect\n");
  30. len = sizeof(struct sockaddr);
  31. //接受到请求
  32. if((new_fd = accept(sockfd,(struct sockaddr * ) &their_addr,&len)==-1){
  33. perror("accept");
  34. exit(EXIT_FAILURE);
  35. }else{
  36. //创建子进程去处理请求
  37. if(-1 == (pid = fork())){
  38. perror("fork");
  39. exit(EXIT_FAILURE);
  40. }else if(pid == 0){
  41. //子进程发送信息
  42. while(1){
  43. bzero(buf , MAXBUF + 1);
  44. fgets(buf,MAXBUF,stdin);
  45. if!=strncasecmp(buf,"quit",4){
  46. print("close this connect!\n");
  47. break;
  48. }
  49. len = send(new_fd,buf,strlen(buf)-1,0);
  50. if(len<0){
  51. printf("send failure!\n");
  52. break;
  53. }
  54. }
  55. }else{
  56. //子进程接受信息
  57. while(1){
  58. bzero(buf,MAXBUF + 1);
  59. len = recv(new_fd, buf, MAXBUF, 0);
  60. if(len>0)
  61. printf("recv: %s , %dByte recv\n",buf,len);
  62. else if(len<0){
  63. printf("recv failure\n");
  64. break;
  65. }
  66. else{
  67. printf("the other one close quit\n");
  68. break;
  69. }
  70. }
  71. }
  72. close(new_fd);
  73. close(sockdf);
  74. return 0;
  75. }
  76. }
  77. //client端代码
  78. int main(){
  79. int sockfd; //socket file describtion 套接字文件描述符 , 指代套接字文件的标号
  80. int new_fd;//接受到请求的套接字
  81. socketlen_t len;//套接字的长度
  82. struct sockaddr_in dest;//套接字地址结构体
  83. unsigned int myport = 7575;
  84. unsigned int lisnum = 5;//最大监听数
  85. char buf[MAX_BUF + 1];//接受消息的buf
  86. if((sockfd = socket(AF_INET ,SOCK_STREAM , 0)) == -1){ //创建socket对象
  87. perror("socket");
  88. exit(EXIT_FALLURE);
  89. }
  90. bzero(&my_addr, sizeof(my_addr));
  91. my_addr.sin_family = AF_INET; //设置协议
  92. my_addr.sin_port = htons(myport);//设置port
  93. my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//设置ip
  94. //套接字地址与socket对象绑定
  95. if(bind(sockfd,(struct sockaddr *) &my_addr , sizeof(struct sockaddr))==-1){
  96. perror("bind");
  97. exit(EXIT_FAILURE);
  98. }
  99. //监听
  100. if(listen(sockfd,lisnum)==-1){
  101. perror("listen");
  102. exit(EXIT_FAILURE);
  103. }
  104. printf("wait for connect\n");
  105. len = sizeof(struct sockaddr);
  106. //接受到请求
  107. if((new_fd = accept(sockfd,(struct sockaddr * ) &their_addr,&len)==-1){
  108. perror("accept");
  109. exit(EXIT_FAILURE);
  110. }else{
  111. //创建子进程去处理请求
  112. if(-1 == (pid = fork())){
  113. perror("fork");
  114. exit(EXIT_FAILURE);
  115. }else if(pid == 0){
  116. //子进程发送信息
  117. while(1){
  118. bzero(buf , MAXBUF + 1);
  119. fgets(buf,MAXBUF,stdin);
  120. if!=strncasecmp(buf,"quit",4){
  121. print("close this connect!\n");
  122. break;
  123. }
  124. len = send(new_fd,buf,strlen(buf)-1,0);
  125. if(len<0){
  126. printf("send failure!\n");
  127. break;
  128. }
  129. }
  130. }else{
  131. //子进程接受信息
  132. while(1){
  133. bzero(buf,MAXBUF + 1);
  134. len = recv(new_fd, buf, MAXBUF, 0);
  135. if(len>0)
  136. printf("recv: %s , %dByte recv\n",buf,len);
  137. else if(len<0){
  138. printf("recv failure\n");
  139. break;
  140. }
  141. else{
  142. printf("the other one close quit\n");
  143. break;
  144. }
  145. }
  146. }
  147. close(new_fd);
  148. close(sockdf);
  149. return 0;
  150. }
  151. }
  152. //client端代码

简答题:

对于shell概念的理解

Shell就像一个壳层,这个壳层介于用户和操作系统之间,负责将用户的命令解释为操作系统可以接收的低级语言,并将操作系统响应的信息以用户可以了解的方式来显示。
从用户登陆到注销期间,用户输入的每个命令都会经过解译及执行,其负责机制就是shell。shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。有一些命令,如改变工作目录命令cd,是shell内置命令。还有一些命令,例如拷贝命令cp和移动命令mv,是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。

两种管道文件的对比

无名管道(pipe):多用于亲缘关系进程间通信
有名管道(fifo):用于任何同主机进程通信

线程对信号操作的特性

link、onlink链接文件的算法

会话进程组的特性

线程的资源

线程自己基本上不拥有系统资源,只拥有少量在运行中必不可少的资源(如程序计数器、一组寄存器、栈、线程信号掩码、局部线程变量和线程私有数据),但是它可与同属一个进程的其他线程共享进程所拥有的全部资源(同一地址空间、通用的信号处理机制、数据与I/O)。
程序计数器:标识当前线程执行的位置;
一组寄存器:当前线程执行的上下文内容;
栈:用于实现函数调用、局部变量。因此,局部变量是私有的;
线程信号掩码:因此可以设置每线程阻塞的信号,见本书下一章内容;
局部线程变量:在栈中申请的数据;线程私有数据。见前一小节介绍。

管道的实现

父子进程间的消息通信

线程调度策略

image.png

线程同步机制

image.png