1.0.12是什么
linux-0.12目录为修改过的源代码,其中加入了中文注释,修改部分代码使其能在现在的环境下编译,并且支持GDB调试。
文件类型,判断什么类型,比如可执行文件是什么类型
- 目录文件
- 字符设备文件
- 块设备文件
- 常规文件
- 管道文件
- 符号连接文件
- 套接字文件
信号发送函数
//函数声明 ppt格式
extern int pthread_kill(pthread_t pthreadid, int signo)
//课本格式 P238
int kill(_pid_t _pid, int _sig)
//_pid:线程id
/*
pid > 0 :发送给pid值位pid的进程
pid = 0 :发送给和当前进程在同意进程组的所有进程
pid = -1 : 发送给系统内调用者可以发送信号的所有进程
_sig:信号
如果signo为0,就会进行错误检查而不发送信号,成功完成后就会返回0,如果检查出错误,则会返回一个错误编号
//
管道文件创建函数
extern int pipe(int pipdes[2]);
/*
此函数会将两个整型文件描述于_pipeds[0](读)和_pipeds[1](写)中,他们分别指向管道的两端,如果系统调用失败,将返回-1
*/
用户态空间印象,堆栈代码数据每部分功能,生命周期
代码区(text segment)。加载的是可执行文件代码段
全局初始化数据区/静态数据区(Data Segment)。加载的是可执行文件数据段
未初始化数据区(BSS)。加载的是可执行文件BSS段
堆区(heap)。用于动态内存分配。堆在内存中位于BSS区和栈区之间
栈区(stack)。由编译器自动分配释放,存放函数的参数值、返回值、局部变量等
ipc机制有哪几种
tcp与udp的区别
tcp和udp的编程实现(编程题)
//server端代码
int main(){
int pid;
int sockfd; //socket file describtion 套接字文件描述符 , 指代套接字文件的标号
int new_fd;//接受到请求的套接字
socketlen_t len;//套接字的长度
struct sockaddr_in my_addr, their_addr;//套接字地址结构体
unsigned int myport = 7575;
unsigned int lisnum = 5;//最大监听数
char buf[MAX_BUF + 1];//接受消息的buf
if((sockfd = socket(AF_INET ,SOCK_STREAM , 0)) == -1){ //创建socket对象
perror("socket");
exit(EXIT_FALLURE);
}
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = AF_INET; //设置协议
my_addr.sin_port = htons(myport);//设置port
my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//设置ip
//套接字地址与socket对象绑定
if(bind(sockfd,(struct sockaddr *) &my_addr , sizeof(struct sockaddr))==-1){
perror("bind");
exit(EXIT_FAILURE);
}
//监听
if(listen(sockfd,lisnum)==-1){
perror("listen");
exit(EXIT_FAILURE);
}
printf("wait for connect\n");
len = sizeof(struct sockaddr);
//接受到请求
if((new_fd = accept(sockfd,(struct sockaddr * ) &their_addr,&len)==-1){
perror("accept");
exit(EXIT_FAILURE);
}else{
//创建子进程去处理请求
if(-1 == (pid = fork())){
perror("fork");
exit(EXIT_FAILURE);
}else if(pid == 0){
//子进程发送信息
while(1){
bzero(buf , MAXBUF + 1);
fgets(buf,MAXBUF,stdin);
if!=strncasecmp(buf,"quit",4){
print("close this connect!\n");
break;
}
len = send(new_fd,buf,strlen(buf)-1,0);
if(len<0){
printf("send failure!\n");
break;
}
}
}else{
//子进程接受信息
while(1){
bzero(buf,MAXBUF + 1);
len = recv(new_fd, buf, MAXBUF, 0);
if(len>0)
printf("recv: %s , %dByte recv\n",buf,len);
else if(len<0){
printf("recv failure\n");
break;
}
else{
printf("the other one close quit\n");
break;
}
}
}
close(new_fd);
close(sockdf);
return 0;
}
}
//client端代码
int main(){
int sockfd; //socket file describtion 套接字文件描述符 , 指代套接字文件的标号
int new_fd;//接受到请求的套接字
socketlen_t len;//套接字的长度
struct sockaddr_in dest;//套接字地址结构体
unsigned int myport = 7575;
unsigned int lisnum = 5;//最大监听数
char buf[MAX_BUF + 1];//接受消息的buf
if((sockfd = socket(AF_INET ,SOCK_STREAM , 0)) == -1){ //创建socket对象
perror("socket");
exit(EXIT_FALLURE);
}
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = AF_INET; //设置协议
my_addr.sin_port = htons(myport);//设置port
my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//设置ip
//套接字地址与socket对象绑定
if(bind(sockfd,(struct sockaddr *) &my_addr , sizeof(struct sockaddr))==-1){
perror("bind");
exit(EXIT_FAILURE);
}
//监听
if(listen(sockfd,lisnum)==-1){
perror("listen");
exit(EXIT_FAILURE);
}
printf("wait for connect\n");
len = sizeof(struct sockaddr);
//接受到请求
if((new_fd = accept(sockfd,(struct sockaddr * ) &their_addr,&len)==-1){
perror("accept");
exit(EXIT_FAILURE);
}else{
//创建子进程去处理请求
if(-1 == (pid = fork())){
perror("fork");
exit(EXIT_FAILURE);
}else if(pid == 0){
//子进程发送信息
while(1){
bzero(buf , MAXBUF + 1);
fgets(buf,MAXBUF,stdin);
if!=strncasecmp(buf,"quit",4){
print("close this connect!\n");
break;
}
len = send(new_fd,buf,strlen(buf)-1,0);
if(len<0){
printf("send failure!\n");
break;
}
}
}else{
//子进程接受信息
while(1){
bzero(buf,MAXBUF + 1);
len = recv(new_fd, buf, MAXBUF, 0);
if(len>0)
printf("recv: %s , %dByte recv\n",buf,len);
else if(len<0){
printf("recv failure\n");
break;
}
else{
printf("the other one close quit\n");
break;
}
}
}
close(new_fd);
close(sockdf);
return 0;
}
}
//client端代码
简答题:
对于shell概念的理解
Shell就像一个壳层,这个壳层介于用户和操作系统之间,负责将用户的命令解释为操作系统可以接收的低级语言,并将操作系统响应的信息以用户可以了解的方式来显示。
从用户登陆到注销期间,用户输入的每个命令都会经过解译及执行,其负责机制就是shell。shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。有一些命令,如改变工作目录命令cd,是shell内置命令。还有一些命令,例如拷贝命令cp和移动命令mv,是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。
两种管道文件的对比
无名管道(pipe):多用于亲缘关系进程间通信
有名管道(fifo):用于任何同主机进程通信
线程对信号操作的特性
link、onlink链接文件的算法
会话进程组的特性
线程的资源
线程自己基本上不拥有系统资源,只拥有少量在运行中必不可少的资源(如程序计数器、一组寄存器、栈、线程信号掩码、局部线程变量和线程私有数据),但是它可与同属一个进程的其他线程共享进程所拥有的全部资源(同一地址空间、通用的信号处理机制、数据与I/O)。
程序计数器:标识当前线程执行的位置;
一组寄存器:当前线程执行的上下文内容;
栈:用于实现函数调用、局部变量。因此,局部变量是私有的;
线程信号掩码:因此可以设置每线程阻塞的信号,见本书下一章内容;
局部线程变量:在栈中申请的数据;线程私有数据。见前一小节介绍。