1、问用锁解决两个线程同时访问同一个全局变量问题带来的坏处?
答、
2、两个进程同时访问一个全局变量是不安全的?
答、对。
3、问应用线程时一般都要结合消息队列来使用?
答、对。
4、问什么是线程池?应用范围有哪些?
答、线程池就是多个线程处理同一个事情。
1)、需要大量的线程来完成任务,且完成任务的时间比较短。 WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。 但对于长时间的任务,比如一个Telnet连接请求,线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。
2)、对性能要求苛刻的应用,比如要求服务器迅速响应客户请求。
3)、接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。突发性大量客户请求,在没有线程池情况下,将产生大量线程,虽然理论上大部分操作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限,并出现"OutOfMemory"的错误。
5、问在服务器中使用多线程的场景是怎样的?
答、主线程用于接收报文,子线程用来获取报文和处理报文。
6、问在客户端中使用多线程的场景是怎样的?
答、主线程保存任务,子线程获取任务。
7、问pthread_join会不会阻塞调用它的线程?
答、会。
8、问pthread_join回收线程的本质是什么?
答、回收线程的PCB。
9、问在线程里调用exit会造成什么后果?
答、退出整个进程。
10、问获得线程ID号的函数是什么?
答、pthread_self。
11、问被创建的新线程是什么?
答、新的指令执行序列。
12、问线程有没有PCB?
答、有,而且和进程的PCB结构完全一样。PCB中的虚拟地址空间和创建它的进程的虚拟地址空间完全保持一致。
13、问设置屏蔽集合的函数?
答、sigprocmask。
14、问给出父进程调用wait来回收子进程的PCB时,不被阻塞的机制?
答、一般子进程退出和状态变化时,都会发射SIGCCHLD信号,可以通过设置对该信号的信号处理函数来调用wait函数回收子进程的尸体。
15、问如何查看能够被设置打断后重启的系统调用?
答、man 7 signal.
16、问如果在执行系统调用函数过程中,被信号打断了,等信号处理后,这个系统调用函数能执行吗?有补救的方法吗?
答、不能,默认执行失败,错误码是EINTR。有些系统调用函数可以设置打断后重启机制,这样等信号处理完成后,该函数不会被打断。继续重新执行。如果signal函数注册信号处理函数,默认被中断的系统调用是自动重启的。
17、问什么是不可靠信号?
答、信号值小于32的都是不可靠信号。它们都有一个共同特点的,当接收到一个信号,来不及处理,又收到同一个信号,那么这两个信号合并成一个信号。
18、问什么时候内核会在进程的PCB中记录信号?
答、进程无法继续了。例如除零操作、非法访问内存地址;
19、问信号的作用?
答、内核和进程通信的方式。
20、简述信号的处理过程?
答、如果内核希望打断进程的顺序执行,那么内核会在进程的PCB中记录信号,当这个进程被分配到CPU,进入执行状态,首先会检查是否有信号,如果有信号,那么进程会先尝试执行信号处理函数。
21、问进程组长退出以后,进程组的其他进程的组号有没有变化?
答、没有。
22、问session领导退出会造成什么后果?
答、这个session内所有进程都退出。
23、问僵尸进程什么时候会被清理?
答、①、父进程调用wait函数回收;②、父进程退回。
24、问僵尸进程会造成的唯一后果?
答、内存泄漏。
25、进程只能访问虚拟地址?
答、对。
26、给出ps aux后的进程状态集合
答、
进程状态查阅表
PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers
(header "STAT" or "S") will display to describe the state of a process.
D Uninterruptible sleep (usually IO)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
T Stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z Defunct ("zombie") process, terminated but not reaped by its parent.
For BSD formats and when the stat keyword is used, additional characters may
be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group
27、问进程的状态有哪些?
答、5个、0表示可运行状态、1表示中断等待状态、2表示不可中断状态、3表示僵死状态、4进程已经停止、5交换状态。
28、问如何获得进程的环境变量?
答、setenv、getenv、unsetenv
29、问环境变量的内容是什么?
答、进程运行时的环境信息。
30、问unlink的作用?
答、减少inode结点的链接个数。
31、问什么是虚拟文件系统VFS?
答、在用open打开文件时,内核会为打开文件创建文件描述符指针(进程PCB)、文件表、vnode表。
32、问从磁盘系统结构,可以将磁盘分成几个部分?
答、inode、目录项、数据项。
33、问目录的目录项结构是怎样的?inodenumber指向什么地方?
答、inodenumber 文件名;
inodenumber指向一个inode结点。该inode结点在磁盘上。
35、问硬链接的作用???
答、在硬链接文件所在的目录的数据快中添加指向被链接文件inode的inodenumber ,但是该inodenumber对应的文件名不再是被链接的文件名,而是新建的硬链接文件的文件名字。
36、问一般新建目录和文件,会不会被分配inode?
答、会。
37、文件锁的粒度是什么?记录锁的粒度是什么?
答、文件锁的粒度是整个文件;记录锁的粒度是部分。
38、问wc file的结果?如何详细取结果中的各数?
答、file文件内的行数、单词数、字符数、文件名;
wc -l取行数;
wc -w取单词数;
wc -c取字符数。
39、问某文件的权限为: -rw-r--r--,用数值形式表示该权限,则该八进制数为:_____,该文件类型是__普通文件_____.
答、0644(其中0表示8进制)、普通文件
40、给出判断一个十进制数的二进制的1出现个数的位数的程序?
答、int func(int x)
{
int countx = 0;
while(x)
{
countx++;
x = x&(x-1);
}
return countx;
}
非常重要,很有可能会被面试到。
41、Linux下两个进程可以同时打开同一个文件,这时如下描述错误的是:———(阿里巴巴笔试题).E。
A. 两个进程中分别产生生成两个独立的fd
B. 两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性
C. 进程可以通过系统调用对文件加锁,从而实现对文件内容的保护
D. 两个进程可以分别读取文件的不同部分而不会相互影响
E. 任何一个进程删除该文件时,另外一个进程会立即出现读写失败
答、E;
42、问创建一个目录文件时,该文件中的.和..对应的inode存放在什么地方?
答、当创建一个目录文件时,系统会为该目录分配一个inode,同时分配一个数据块,inode对应的指针指向就是该数据块,在该数据块中存放了文件.和..的inode;注意就自身而言.和..仍旧是目录。
43、问改变文件所有者执行权限的命令?所有用户的执行权限呢?
答、chmod u+x file1;chmod a+x file1;
44、问文件权限分成四段分别表示什么?
答、文件类型、文件所有者的权限、文件所有组的权限、其它用户的权限。
45、问切换到主目录的命令?
答、cd ~lzx;
46、问
gcc MYTHREAD.c -o mythread
如何MYTHREAD.c中有线程,这样编译对吗?
答、错误,因为没有-lpthread。
47、问.目录和..目录分别指向什么地方?
答、.目录指向本地目录;..目录指向上一个文件目录。
48、问为什么在操作文件时,要把目录.和目录..忽略掉?
答、否则会进入死循环。
49、问统计文件中指定字符串出现的行数的命令?
答、grep -o "in" file | wc -l.
50、问压缩文件命令,文件a.txt?
答、tar -czf mm.tar.gz a.txt.
51、问文件名存放在什么地方?
答、存放在文件所在目录的文件内容部分。
52、mount命令的作用?什么是虚拟文件系统?
答、将分区挂载到虚拟文件系统。虚拟文件系统在内核上,是部分硬盘结构的映像。
53、问硬链接存储在硬盘上吗????
答、没有。
54、问设置目录的stickybit位的命令?
答、chmod o+t。
55、问对目录设置stickybit位,有什么作用?
答、账户只能删除和修改它自己创建的文件,对于其它账户创建的文件,它不能修改和删除。例如公共目录/tmp。
56、问设置SGID位的命令?
答、chmod g+s或
chmod g-s;
57、问设置了目录的SGID位后,有什么效果?
答、在这个目录下创建的文件,拥有者是创建文件的进程的有效账户,而拥有组是该目录的拥有组。
58、问如何设置文件的SUID属性?
答、chmod u+s或者chmod u-s;
59、问格式化磁盘的命令?
答、sudo mkfs.ext4 /dev/sdb1
60、问磁盘分区的命令?
答、sudo fdisk /dev/sdb
61、问显示文件描述符最大值和栈空间的函数?
答、ulimit。
62、问读写配置信息的函数?获得配置信息的函数?
答、sysconf;
getconf;
63、问怎样提高IO效率?
答、通过内核缓存。
64、问fcntl的作用?
答、fcntl可以设置文件描述符属性、文件状态属性、文件描述复制、设置文件锁、设置文件通知。
66、问大规模文件描述符解决多路IO问题时,select效率怎么样?epoll效率怎么样?
答、效率低。epoll效率高。
67、问select和epoll哪个出现早?
答、select;
68、问select函数内部的数据结构?
答、顺序查找。位图。
69、问多路IO造成了什么问题?
答、造成了cpu资源的浪费问题。
70、问
#include"../header.h"
int main()
{
char a=0xff;
//int b=(unsigned int)a;
int b=(unsigned int)(unsigned char)a;
unsigned int c=(unsigned int)a;
printf("a=%d,b=%d,c=%u,d=%d\n",(int)a,b,c,(unsigned char)a);
return 0;
}
输出结果?
答、a=-1,b=255,c=4294967295,d=255。
71、问unsigned int数据类型的输出格式?如果unsigned int 类型的变量任旧用%d输出,会造成什么问题?
答、%u。会发生由unsigned int 类型向int类型的强制类型转换。
72、问
#include"../header.h"
int main()
{
char a=0xff;
int b=(unsigned int)a;
printf("a=%d,b=%d\n",(int)a,b);
return 0;
}
打印结果?说明了什么问题?(linux上执行)
答、a=-1,b=-1;
说明了int 型变量始终将其它变量的高位看成是符号位。unsigned int
73、问IO默认情况是阻塞还是非阻塞?
答、阻塞。
74、问如何让阻塞IO变成非阻塞IO?
答、通过设置O_NONBLOCK标记(类似O_RDONLY)。
75、问什么是非阻塞IO?
答、IO通常是阻塞的,比如读鼠标文件,如果鼠标未产生数据,那么读数据就会阻塞,一直到鼠标移动才能返回。阻塞型IO一直在等。
76、问保存的设置用户ID和保存的设置组ID是如何使用的?
答、①、在一个进程中执行另一个程序时,往往需要用fork函数和exec函数,
exec函数后子进程中所有部分会被exec参数中的程序替代,
但是保存的设置用户ID和保存的设置组ID就是父进程的有效用户ID和有效组ID。
②、当程序要打开一个文件,这个文件中的用户ID位会被设置一个标志,
当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID,
同时保存的设置用户ID存储有效用户ID。组ID同理。
77、问linux上口令和密码的区别?
答、没区别。
78、问pthread_cancel函数常用吗?
答、不常用。
79、问如何终止看似是死循环的线程?
答、通过pthread_cancel函数。
80、
#include"../header.h"
#include<pthread.h>
void *thread_func(void *ptr)
{
#if 0
while(1)
{
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
sleep(1);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
}
#endif
while(1)
{
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
sleep(1);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_testcancel();
}
}
int main()
{
pthread_t tid;
pthread_create(&tid,NULL,thread_func,NULL);
pthread_cancel(tid);
pthread_join(tid,NULL);
printf("exit\n");
}
简述pthread_setcancelstate的函数的意义?
答、首先pthread_cancel函数在主函数中被调用,可以防止该函数后面的程序执行时,线程也执行;
其次如果线程中有循环语句,且里面有退出点(sleep),如果不用pthread_setcancelstate进行保护,
线程就会在sleep位置处退出,如果sleep后面还有我们要执行的函数,
就不能得到执行。所以设置pthread_setccancelstate函数可以让我们需求的程序在退出点后面能够执行。
最后pthread_testcancel()函数则能很好地与pthread_cancel函数相呼应,在我们想要的位置结束线程。
81、
#include"../header.h"
#include<pthread.h>
void *thread_func(void *ptr)
{
while(1)
{
;
// sleep(1);
}
}
int main()
{
pthread_t tid;
pthread_create(&tid,NULL,thread_func,NULL);
pthread_cancel(tid);
pthread_join(tid,NULL);
printf("exit\n");
}
程序执行能退出吗,能够打印出exit吗?如何纠正?说明了什么问题?
答、不能,不能,加上sleep;
说明使用pthread_cancel函数时,如果线程中有循环,要在线程中设置退出点,所谓的退出点就是一些可以
被pthread_cancel执行时能够让线程退出的函数。如果线程没有循环,就能正常退出。是不需要退出点的。
82、问线程的唯一一种非法退出是什么?
答、线程取消:pthread_cancel.
83、问线程越多,强占的cpu越多?
答、对。
84、问使用分离式线程的好处?
答、pthread_detach(tid);线程运行结束后自动回收线程。如果再用pthread_join进行回收是会返回错误的,因为不会成功运行。
85、问消息队列模型必须如何搭配使用?
答、消息队列和锁;消息队列和信号量。
86、在使用条件变量的地方可以使用信号量?
答、对。
87、问哪种线程同步机制和信号量类似?
答、条件变量。
88、问pthread_cond_signal是唤醒一个带有pthread_cond_wait线程还是所有带有pthread_cond_wait线程?怎样唤醒所有的?
答、一个。使用pthread_cond_broadcast可以唤醒所有的。
89、问如果pthread_cond_signal发出信号时带有pthread_cond_wait的进程没有执行pthread_cond_wait而是执行本例程中的其它程序,那么等到要执行pthread_cond_wait时,会不会阻塞?
答、会。前面的信号不会被保存处理。更直接一点地说,pthread_cond_signal只能唤醒正在阻塞的进程。
90、问使用条件变量的代码是怎样的?为什么必须要加锁?
答、pthread_cond_wait(&cond,&mutex);
在本例程内部需要有代码
pthread_mutex_unlock(&mutex);
wait.....
pthread_mutex_lock(&mutex);
91、问设置用户ID位的作用是什么?
答、在执行exec程序时,改变执行后的进程的实际用户ID和有效用户ID。
92、实际上所有程序都是由另一个进程执行的?
答、对。
93、问与进程相关联的用户ID和组ID有哪些?
答、实际用户ID和实际组ID(在登录会话时确定,即人的登录账户)、
有效用户ID和有效组ID以及附加组ID(与文件的所有者ID和组ID其它组ID
相结合进而判断进程是否有对文件的三种操作的权限)、
94、问网络的本质?
答、进程间通信。
95、问信号机制最开始是用来做什么的?
答、杀死进程。
96、问信号机制带来的问题?
答、重入问题、打断阻塞调用、可能不可靠(发五次相同的信号只执行一次因为没有对信号的计数)。
97、一个进程或一个线程只有一个阻塞点?
答、对。
98、在没有多线程之前,怎么解决多路I/O问题?
答、select epoll;
99、问多线程能不能解决多路I/O问题?
答、可以。
100、多路I/O很重要?
答、对。
101、文件的账户属性是什么?是动态的还是静态的?
答、用来判断用户的读写执行权限。是静态的属性;和进程的用户ID配合起来才有意义。
102、问程序的指令存放在哪?
答、不是放在PCB里。
103、问如何判断一个指针变量内存的指针是栈指针还是堆指针?
答、例如
void ptr(void *a)
{
}
int main()
{
}
如果变量a的地址比a内存储的指针小,则a内存储的指针是在栈上;如果大,是在堆上。原因是内存四区模型的栈空间在堆上面。
104、alloca函数的作用?
答、分配栈空间。
105、问brk分配堆内存常用吗?
答、不常用。
106、问文件有哪些属性?
答、文件类型、文件权限、文件ID、文件inode、文件大小;
107、问linux和windows操作系统的线索是什么?
答、linux是从输入和输出设计操作系统;所以文件对linux很重要,所以linux上一切皆文件。
windows是从窗口出发设计操作系统。
108、问为什么fastdb比sqlite要快?
答、sqlite使用的锁锁住了整个文件;但是fastdb只是锁住了文件的部分。
109、问内存数据库是什么?
答、sqlite和fastdb(比sqlite更快);因为磁盘数据库操作效率不高,用内存数据库更快。
110、问什么是量化交易?
答、根据买入和卖出的行情,由软件自动决定选择股票。
111、使用O_APPEND打开文件写的缺点?
答、每次只能从文件末尾写文件。
112、问FD_NOEXEC的作用?
答、设置该属性以后,exec程序完成后,原文件自动关闭。
113、问数据库的本质是什么?
答、文件。
114、问epoll是线程安全的?
答、对。
115、问什么是c100k问题?c1000k问题?
答、参考116.
116、问c10k问题是什么?
答、一台服务器同时支持成千上万个客户端。
117、问epoll的内部实现所用的数据结构是什么?
答、平衡二叉树。确切地说是红黑树。
116、问什么多路I/O复用技术是linux和unix共有的?
答、kqueue。
117、问epoll是linux独有的,其它unix是没有的?
答、对。
118、问为什么以前qq斗地主的一个房间只有固定的人数?
答、因为一个房间就是一个进程,一个进程最多有1024个文件描述符。还有硬件限制。
119、问I/O复用的方法?
答、select、epoll、kqueue、poll、iocp
120、问write会不会阻塞?
答、会,当缓冲区满的时候。
121、问select能容纳多少个文件描述符?通过什么方式办到的?
答、1024个。通过位域描述符。
122、问函数的参数使用const 指针的情况?
答、如果指针变量不是传出,只作为传入参数,加const。这是行业规定。
123、select的作用?
答、从阻塞的I/O的文件描述符中挑选一个文件描述符。
124、select是重点?
答、对。
125、问I/O集合是什么?
答、文件描述符集合。
126、问多路I/O问题出现的原因?
答、一个程序不能有两个地方阻塞,例如一个读键盘另一个读鼠标。
127、问一个程序能不能有两个阻塞的地方?
答、不能。
128、问char型变量的高位是1,转换成整数会出现什么现象?
答、会出现负数。所以要用unsigned强转。
129、问用open打开非设备文件会不会有阻塞现象?打开设备呢?
答、不会。打开设备文件会阻塞。
130、介绍文件、进程、使用者的ID关系?
答、所有ID都分成用户ID和组ID;对于文件,
131、问在shell命令上输入\表示什么?
答、换行继续输入命令。
132、问
{
AutoLock lock(mutex);
a++;
}
用大括号限制加锁的范围有什么好处?
答、增强可读性,避免加锁范围过大力度过大。
133、问枷锁解锁时要注意什么?
答、枷锁和解锁间的程序不同有goto语句;也不能有return等程序终止执行的语句。
134、问为什么报错?
lzx@lzx-vm:~/fileICE/dya3/THICE$ vim THICE8.cpp
lzx@lzx-vm:~/fileICE/dya3/THICE$ gcc THICE8.cpp -lpthread
/tmp/ccbHOuQd.o: In function `std::list<int, std::allocator<int> >::_M_insert(std::_List_iterator<int>, int const&)':
THICE8.cpp:(.text._ZNSt4listIiSaIiEE9_M_insertESt14_List_iteratorIiERKi[_ZNSt4listIiSaIiEE9_M_insertESt14_List_iteratorIiERKi]+0x3a): undefined reference to `std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)'
/tmp/ccbHOuQd.o: In function `std::list<int, std::allocator<int> >::_M_create_node(int const&)':
THICE8.cpp:(.text._ZNSt4listIiSaIiEE14_M_create_nodeERKi[_ZNSt4listIiSaIiEE14_M_create_nodeERKi]+0x70): undefined reference to `__cxa_end_catch'
THICE8.cpp:(.text._ZNSt4listIiSaIiEE14_M_create_nodeERKi[_ZNSt4listIiSaIiEE14_M_create_nodeERKi]+0x83): undefined reference to `__cxa_begin_catch'
THICE8.cpp:(.text._ZNSt4listIiSaIiEE14_M_create_nodeERKi[_ZNSt4listIiSaIiEE14_M_create_nodeERKi]+0x9b): undefined reference to `__cxa_rethrow'
/tmp/ccbHOuQd.o: In function `__gnu_cxx::new_allocator<std::_List_node<int> >::deallocate(std::_List_node<int>*, unsigned long)':
THICE8.cpp:(.text._ZN9__gnu_cxx13new_allocatorISt10_List_nodeIiEE10deallocateEPS2_m[_ZN9__gnu_cxx13new_allocatorISt10_List_nodeIiEE10deallocateEPS2_m]+0x1c): undefined reference to `operator delete(void*)'
/tmp/ccbHOuQd.o: In function `__gnu_cxx::new_allocator<std::_List_node<int> >::allocate(unsigned long, void const*)':
答、本该g++编译,在这里用了gcc。
135、问终端是如何防止后台程序从终端读入数据和输出数据到终端的?
答、由终端驱动程序发送信号控制。
136、问给出使终端驱动产生信号的三个字符命令?
答、中断字符ctrl+c或delet,使终端驱动程序产生SIGINT信号;
退出字符(ctr1+\)产生SIGQUIT;
挂起字符(ctrl+z)产生SIGTSTP;
137、当要挂起前台进程时,通过在终端输入挂起键ctrl+Z,问这个字符会发往哪个对象,该对象又如何处理?
答、键入此字符会使终端驱动程序将信号SIGTSTP送到前台进程组中的所有进程。
138、问终端设备驱动程序是如何知道将终端输入和终端产生的信号送到哪里?
答、内核根据前台进程组来决定信号发往哪里。
139、问前台进程组只能是一个组吗?
答、对。
140、问一个会话能不能没有控制终端?
答、可以。
141、问进程组的组长能不能调用setsid函数?
答、不能。
142、问在shell中是如何将同一进程组ID的进程建立联系的?
答、管道线。
143、问为了设置子进程的进程组,要注意什么?
答、必须同时在父进程程序中编写修改子进程的进程组的代码,及在子进程中自己修改自己进程组ID代码。因为不确定父、子进程运行的先后次序。
144、问为进程设置进程组ID的要求?
答、只能为自己或它的子进程设置进程组ID。如果子进程调用了exec,父进程就不再能改变子进程的进程组ID。
145、问使得进程加入现有的组或者创建一个新进程组的函数?
答、setpgid;
146、问什么是进程组的生存期?
答、从进程组创建开始到最后一个进程离开为止。
147、问组长进程有什么作用?
答、创建一个进程组,创建该组中的进程。
148、问什么是组长进程?
答、进程组ID等于进程ID。
149、问返回调用进程的进程组ID的函数?
答、getpgrp。
150、问如何设置进程组?
答、根据作业,作业相同,进程组最好相同。
151、问哪些终端登录和BSD终端登录类似?
答、Mac OS X终端登录、Linux终端登录、Solaris有两种其中一种与BSD登录方式一样
152、问153到160介绍的用户登录终端的方式属于什么类型的终端登录?
答、BSD终端登录。
153、问登录shell通过login程序创建以后执行什么工作?
答、启动文件(.profile或.bash_profile或.bash_login或.cshrc或.login等);
154、问当shell终止时,init接收的信号类型是什么?
答、SIGCHLD;
155、问login执行哪些工作?
答、①、login得到了用户名(通过getty程序执行exec后得到),
开始调用getpwnam取得相应用户的口令文件登录项;
②、调用getpass以显示提示输出:password:然后读用户键入的口令(密码);
③、调用crypt加密用户键入的口令,并与口令文件中登录项的pw_passwd字段相
比较。④、如果三中用户输入口令错误导致登录失败,login程序会用参数
1调用exit表示登录过程失败。父进程通过login程序结束时的返回值得知子
进程终止状态,于是再调用fork,接着通过exec执行getty程序,重复上述过程。
⑤、对于正确登录的用户,login还要继续执行:将当前工作目录更改为该用户的
起始目录、调用chown改变该终端的所有权,使登录用户成为它的所有者、
将对该终端设备id访问权限改变成该用户的读和写、调用setgid及initgroups设
置进程的组ID、用login所得到的所有信息初始化环境:(起始目录(HOME)、
shell(SHELL)、用户名(USER和LOGNAME)、系统默认路径(PATH))、
改变登录用户的用户ID并调用该用户的登录shell(execl("/bin/sh","-sh",(char *)0))、
打印日期消息文件、检查新邮件以及执行其他一些任务等等。上述是主要功能。
156、问getty进程、login进程的ID是怎样的?
答、相同。
157、问什么时候getty程序调用login程序?
答、getty程序执行后会输出login之类的信息;等待用户键入用户名;当用户键入了用户名后,
getty工作完成。开始调用login程序。
158、问创建终端的程序是什么?
答、getty程序。
159、问管理终端的文件是什么?该文件中记录了什么信息?
答、/etc/ttys。该文件中记录了设备名和传递给getty程序的参数。
160、问什么进程使系统进入多用户状态?
答、init进程。
161、问终端是如何分类的?
答、基于字符的终端、仿真简单的基于字符终端的图形终端、运行窗口系统的图形终端。
162、问不带I/O的函数有哪些?
答、read和write。
163、filter file2 | cat file1 - file3 | lpr表示的含义?
答、filter是命令,执行file2,将结果输出给cat,cat读file1的内容,再读该输出结果的内容,最后读file3的内容。
164、问单独的-表示什么?
答、标准输入。
165、问fcntl函数的功能?
答、复制一个现有的描述符、获得/设置文件描述符标记、获得/设置文件状态标志、获得/设置异步I/O所有权、获得/设置记录锁。
166、只要有进程,就一定有进程对应的功能?
答、对。
167、问dup2是不是原子操作?
答、是。
168、问什么是原子操作?
答、要么不执行、要么执行全部、不会只执行操作的一部分。
169、问什么是v结点表?
答、记录了磁盘文件信息的表。
170、问为了打开磁盘文件,需要在内核建立哪三张表?
答、进程表项(PCB)、文件表、v节点表;其中前两个是与进程对应的,后一个是与磁盘文件对应。
171、虚拟文件系统是什么?
答、v结点的结构。
172、问pcb中有没有文件描述符?
答、有。
173、问在文件中但没有写过的字节会被读成什么?
答、0;
174、问用close关闭文件,会不会释放文件上的记录锁?
答、会。
175、问unix的全称?
答、uniplexed information and computing service。本来是UNICS,后来改为UNIX;
是贝尔实验室、通用电气、麻省理工学院合作的项目。
176、问什么是幻数?
答、在标准例如POSIX中通过STDIN_FILEENO、STUDOUT_FILENO、STDERR_FILENO预定义的数字0、1、2等。
178、问例程时什么?
答、一个执行函数。
179、问什么是FreeBSD?
答、类UNIX操作系统。
180、问什么是UNIX操作系统?
答、它是最古老的操作系统。是分时操作系统,支持多用户和多任务。随着时间的推移,UNIX出现了许多不同的版本。
181、问FreeBSD是什么?
答、UNIX操作系统。
182、问UNXI的三个进程时间值是什么?
答、时钟时间、用户CPU时间、系统CPU时间。
183、问UNIX系统的两种时间值是怎样的?
答、日历时间:自1970年1月1日00:00:00以来的秒数;time_t可以保存这个时间值。
进程时间:也称为CPU时间,用来度量进程使用的中央处理机资源。用时钟滴答计算。
clock_t可以保存这个时间值。
184、问什么是附加组?
答、除了对一个登录名指定一个组ID外,还运行一个用户属于另外的组,而且另外的组数可以达到16个。
185、问用来表示用户ID和组ID的整型数的位数是怎样的?
答、32位。
186、问如何根据用户ID找到登录名?
答、在口令文件中查找。
187、问什么是文件的用户ID和文件的组ID?
答、文件的用户ID表示文件的所有者是谁,即谁可以对该文件具有权限。
文件的组ID表示文件的所属组是哪个,即哪个组可以对该文件具有权限。
188、问组名是什么?
答、与组ID相关,一一对应。组名和组ID之间的关系在文件/etc/group中被建立。
189、问设置组ID的作用是什么?
答、允许同组的各个成员之间共享资源例如文件。
190、问什么是组ID?
答、在口令文件登录项中记录,是一个数值。也是系统根据用户的登录名进行分配的。在口令文件中会为每个用户创建记录项,而被分配到相同的组的用户的记录项具有相同的组ID。
191、问用户ID为0的用户是什么?
答、根root用户或超级用户。(用户名是root)
192、问什么是用户ID?
答、口令文件中登录项里的用户ID,它可以向系统标识各个不同的用户。是在系统中根据用户名创建的,而且用户不能更改。每个用户有一个唯一的用户ID。
193、问errno使用的两条规则是什么?
答、如果没有出错,则其值不会被一个例程清除;
任何一个函数都不会将errno值设置为0.
194、问什么时候查看errno的值?
答、当例如像open函数一样正在执行的例程出错时(返回-1),才检验其值。
195、问open函数出错时返回什么?
答、自身返回-1,但是对于errno变量,返回大约15种不同的errno值。表示文件不存在、权限问题等。
196、问多线程之所以能工作的原理是什么?
答、同一时刻可以执行多条机器指令。
197、问waitpid函数返回的是什么?
答、子进程的终止状态。
198、问execlp函数是如何要求参数的格式的?
答、参数以null而不是以换行符结束。
199、进程控制的主要三个函数是?
答、fork、exec、waitpid;
200、问存储在磁盘上的可执行文件,是怎么被调用到存储器并执行的?
答、通过6个exec函数中的一个由内核将程序读入存储器。并执行。
201、问标准I/O是什么?
答、带缓冲的使用I/O函数的接口。不需要担心缓冲区的大小。
202、问当一个新程序打开时,如果没有做任何处理,shell为其打开的文件描述符链接到什么地方?
答、终端。????
203、问当运行一个新程序时,所有的shell都会为其打开三个文件描述符:标准输入、标准输出、标准出错
这句话对不对?
答、对。
204、问文件描述符是怎么产生的?
答、内核打开一个已有文件或创建一个新文件时,返回的。
205、问口令文件里有什么?
答、登录名、加密口令、数组用户ID、数组组ID、注释字段、起始目录、shell程序。
206、问linux上的口令文件是什么?
答、/etc/passwd
207、问为什么要使用opendir、readdir、即closedir对目录进行处理?
答、因为不同的unix系统目录项的实际格式是不一样的。
208、问文件系统根的名字/是不是一个文件名?
答、不是,是特殊的绝对路径名。表示根目录。
209、问linux中用斜线将文件名组合在一起称为什么?
答、路径名。
210、问shell如何分类?
答、终端(交互式shell)、文件(shell脚本)
211、问shell是什么?
答、命令行解释器,读取用户输入,然后执行命令。
212、问广义的操作系统是什么?
答、内核以及一些其他软件。其他软件是系统实用程序、应用软件、shell以及公用函数库。
213、问系统调用是什么?
答、内核的接口。
214、问操作系统是什么?
答、一种软件。
215、内核是什么?
答、一种软件,控制计算机硬件资源,提供程序运行环境。即操作系统软件。
216、问操作系统为应用程序提供的服务有哪些?
答、执行新程序、打开文件、读文件、分配存储区、获得当前时间。
217、问操作系统的作用?
答、为应用程序提供服务。
218、问条件变量的本质?
答、线程的一种同步机制。
219、需不需要为锁的建立分配内存?
答、需要。
220、问读写锁又被称为什么?
答、共享-独占锁。
221、问锁机制的描述?
答、某个线程占有锁,就能对某个资源进行访问。
222、问什么情况下需要考虑线程同步问题?
答、当某个线程要修改变量,而其它线程要读取或在修改变量时,就要考虑线程同步问题。
223、问FreeBSD中线程ID是如何规定的?
答、指向线程数据结构的指针。
224、问线程怎样获得自身的线程ID?
答、通过函数pthread_self。
225、问为什么必须使用函数来对两个线程ID进行比较?
答、线程ID可能是用结构体加typedef定义。
226、问处理器只有一个能实现多线程吗?
答、可以,为了保证一个线程阻塞时,另一个还能用。
227、简述在服务器中进程的分配情况?
答、一个线程负责接收报文,另一个负责处理报文。
228、问管道的大小一般是多少?
答、64k。
229、问进程和线程的功能?
答、进程是资源分配的单位,线程是处理机调度的单位。
230、问所有函数外能不能为全局变量初始化变量?
答、可以。
231、问有没有函数可以一次回收多个线程的尸体?
答、没有,必须通过pthread_join(tid,&ret);指定号tid。
232、问正常退出和异常退出的区别?
答、正常退出会返回正常退出的状态码,但是异常退出不会。
233、问主进程中调用了pthread_exit(0);子线程退不退出?
答、不会。
234、问比较两个线程是否是同一个线程的函数?
答、pthread_equal;
235、问linux上多线程的实现有什么特点?
答、比较复杂,windows上比较简单。
236、问windows上多进程通信容易吗?
答、很麻烦
237、问对于新的应用程序,如何选择进程间通信IPC的方式?
答、尽可能避免使用消息队列以及信号量,而应当考虑全双工管道和记录锁。因为后者使用起来简单些。
238、问信号量的一个常用作用?
答、共享资源的同步访问。
239、信号量算不算IPC?
答、严格地说信号量是同步原语。
240、如何保证进程对共享存储访问的同步?
答、信号量或记录锁。
241、问哪种IPC最快?
答、共享存储。
242、为什么信号量比记录锁所花时间更少,还要多使用记录锁?
答、在只需锁一个资源并且不需要使用xsl信号量的所有花哨的功能,宁可使用记录锁。
原因是使用简易,且进程终止时系统会处理任何遗留下来的锁。
243、问信号量和记录锁相比,时间效率怎么样?
答、记录锁比信号量消耗时间更多。
244、问什么是面向对象?
答、通过参考现实世界中对象的方式封装数据,编写程序,解决问题。
245、如何保证操作是原子操作?
答、尽量使得函数在内核中实现。
246、问信号量的本质是什么?
答、计数器。
247、问仅有的两种支持不同主机上各个进程间IPC的类型?
答、套接字、STREAMS.
248、IPC的全称?
答、InterProcessCommunication。
249、什么叫将守护进程实现为单实例?
答、就是在任一时刻只运行该守护进程的一个副本。
250、问大多数的守护进程的父进程是什么?
答、init进程。
251、问如何判断一个进程是不是守护进程?
答、没有一个守护进程具有控制终端,其终端名设置为问号。
252、问init进程是守护进程吗?
答、是。
253、问什么是系统自举?
答、
254、问与作业相关的信息有哪些?
答、会话ID、进程组ID、控制终端以及终端进程组ID。
255、问ps -axj的命令含义?
答、-a表示显示其他用户所拥有的进程的状态;-x显示没有控制终端的进程状态;-j显示与作业有关的信息。
256、问什么是守护进程?
答、也称精灵进程;在系统自举时启动,仅在系统关闭时才终止,没有控制终端,在后台运行。
257、问不可重入函数可以怎样分类?
答、a)、使用了静态数据结构;b)、调用了malloc或free;c)、是标准I/O函数。因为标准I/O库的很多实现都以不可重入方式使用全局数据结构。
258、问在处理信号时,将函数分为可重入函数和不可重入函数的意义?
答、信号会造成中断,但是信号处理完后,又要继续执行函数,中断正在执行的不可重入函数,等信号处理完后该函数不好恢复。所以执行会被打断,返回执行错误。
259、问当捕捉到某个信号时,被中断的是内核中执行的系统调用这种说法正确吗?
答、对。
260、问什么是不可靠的信号?
答、信号可能会丢失。
261、问fork出的子进程实际上复制的是什么?
答、父进程的存储映像。
262、问什么信号不能被忽略?
答、SIGKILL和SIGSTOP,原因是它们向超级用户提供了使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法内存引用或除以0),则进程的运行行为是未定义的。
263、问线程非法退出,能不能join?
答、能。但是第二个参数必须是NULL。
264、问主线程正常退出(没有调用pthread_exit退出),子线程会退出吗?
答、会。
265、问能不能创建一个自生自灭不需要用户自己收拾的线程?
答、可以。
266、问c及c++中函数是几份?
答、一份。
267、问如何解决strtok的不可重入问题,特别是当运行环境是多线程时?
答、使用strtok_r,不能采用文件枷锁的方法,因为效率太低了。
268、问终端有没有窗口?
答、有。
269、问为了建立会话需不需要结构体记录相关信息?
答、需要。
270、信号量处理线程间通信最大的特点?
答、信号量的值可以超过一,执行了一个就减一。
271、问pthread_cond_signal会唤醒几个?
答、一个。pthead_cond_broadcast唤醒所有。
272、问pthread_cond_signal先唤醒,然后pthread_cond_wait执行?pthread_cond_wait会造成阻塞吗?
答、不会阻塞,
273、问usleep(100*1000)表示什么?
答、睡眠100毫秒。
274、所有锁的使用都会造成性能下降?
答、对。
275、问如何减少因为锁造成的效率低的问题?
答、减小加锁的力度。
276、问锁除了会造成死锁现象,还可能造成什么?
答、效率低的问题。
277、问
class s1
{
public:
s1(int &a)
{
m=a;
}
public:
int m;
}
有没有问题?
答、有,因为是引用,所以构造函数必须使用参数化列表。??测试能通过
class s1
{
public:
s1(int &a):m(a)
{
}
public:
int m;
}
278、问如何解决忘了解锁造成的死锁问题?
答、利用构造函数和析构函数进行锁机制的构建。这种锁称为自动锁。
279、问循环锁的特点?
答、重复加锁不会死锁。但是解决不了完了解锁造成的死锁现象。
280、问goto 程序的使用,有没有可能造成死锁?
答、很有可能。
281、问忘了解锁会造成什么后果?
答、死锁。
282、问对同一个要处理的程序加了两次锁会怎样?
答、死锁。
283、程序不能靠运气活着?
答、对。
284、问线程的使用场景是怎样的?
答、比较复杂的多任务场景。
285、问线程能共享进程的栈空间吗?
答、不能,没有线程的进程不能相互访问的,引入线程概念后也不能。
286、线程共享进程的资源?
答、对。
287、问线程有父子关系吗?能不能相互调用pthread_join回收?
答、没有,能。
288、问pthread_join是不是阻塞函数?
答、是。
289、问子线程运行结束要不要被收尸?
答、主线程通过pthread_join函数收尸。
290、问多线程中,如何正常退出程序?
答、最后一个线程例程结束,或最后一个线程例程调用pthread_exit退出。
291、问在例程中执行exit退出发生什么?如何正确退出线程?若在主线程调用pthread_exit会发生什么?
答、整个程序退出、pthread_exit、主线程会结束。
292、问linux上有没有微妙睡眠函数?
答、有、usleep();
293、问什么是线程的例程?
答、执行线程的函数。
294、问什么是函数的上下文?
答、函数运行的线程。
295、相对于操作系统来说,main函数就是普通函数?
答、对。
296、在windows上用线程好还是进程好?
答、线程,因为线程在最开始就被设计到windows。
297、在linux上用线程好还是进程好?
答、进程。线程本身不是linux上的,是后来补丁的。
298、对有子进程和父进程的程序中,要考虑它们的执行顺序对程序运行结果的影响?
答、对。
299、问会话一定要有终端吗?
答、不是。
300、问前台进程组是什么的属性?
答、终端的属性,不是进程的。
301、问ps命令的父进程是什么?
答、shell。
302、问文件结束符是什么?
答、ctrl+D;
303、一个进程组往往是为了完成一个作业设定的?
答、对。
304、问保证程序能读写控制终端的方法是什么?
答、打开文件/dev/tty。
305、问什么是退出键?
答、ctrl+\;
306、问什么是中断键?
答、ctrl+c;或delete;
307、问会话的本质?
答、一个或多个进程组的集合。
308、问进程间通信能不能用mutex枷锁?(通信实体是共享内存,但是共享内存中设置了锁)
答、可以,但是太麻烦。
309、问给文件加锁的函数?
答、flock、fcntl;
310、问
int main()
{
// int fd=open("share_file",O_RDWR);
int fd=shm_open("/share_file",O_RDWR|O_CREAT|O_EXCL,0777);
if(fd<0)
{
fd=shm_open("/share_file",O_RDWR);
}
void *ptr=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0)
strcpy((char *)ptr,"write by To8");
printf("write\n");
getchar();
close(fd);
shm_unlink("/share_file");
munmap(ptr,4096);
return 0;
}
有什么问题?
答、share_file内存文件大小没有设置。所以进程间通信通过mmap不能成功。
311、问int fd=shm_open("/share_file",O_RDWR);
怎样关闭?
答、close(fd);
shm_unlink("/share_file");两步缺一不可。
312、问int fd=shm_open("share_file",O_RDWR);
有什么问题?
答、必须在share_file前加上/。
313、问shm_open打开的是什么?
答、一块内存。在使用mmap进行内存间通信时使用。用来代替将信息存放到磁盘上。
314、问进程间通信时将通信信息写到硬盘上有什么缺点?
答、内存和硬盘间需要交换数据,所以效率较低。
315、问使用mmap进行没有血缘关系的进程间通信时,映射文件的创建方式?
答、命令行:dd of=share_file if=/dev/zero bs=4096 count=1
316、问mmap既可以在有血缘关系的进程之间进行通信,也可以在没血缘关系的进程之间进行通信?
答、对。
317、问使用mmap进行进程间通信,可以查阅什么文档?
答、shm_overview;
318、问有没有类似管道的双工通信?
答、socketpair;
319、问对于命名管道,如果用open打开,权限是O_RDWR后,open函数是不阻塞的?
答、对。
320、介绍命名管道的机制以及特点?
答、命名管道是通过mkfifo显示创建一个管道文件;在两个.c中一个用open打开后读文件;另一个用open打开后写文件。
321、mkfifo a.fifo;
在.c文件中
int fd=open("a.fifo",O_RDWR);
这样写有什么问题?
答、a.fifo是命名管道,但是管道不能同时写和读,所以O_RDWR的写法是错误的。
322、问匿名管道和命名管道的区别?
答、与匿名相比,它可以用于非亲缘关系的进程。
323、问grep inet |grep -v inet6?中-v inet6的含义?
答、在grep inet的结果中进一步搜索不是inet6的数据。-v是起过滤作用。
324、问linux的shell管道命令|是用来做什么的?
答、管道前面的命令的执行结果如果是输出的话,会作为管道后面的命令的输入数据。
325、问为什么read读管道时会发生阻塞现象?
答、等待另外一端写数据。
326、问管道中没有数据,读管道会发生什么?
答、EOF错误。
327、问进程间能够进行通信的基础是什么?
答、每个进程都共享同一个内核。
328、问管道如何创建?
答、先用数组记录两个文件描述符例如int fd[2];再用pipe(fd)将两个我呢间描述符指向同一个文件。默认情况fd[0]用来读数据;fd[1]用来写数据。
329、问进程间通信有多少种?
答、匿名管道、命令管道、socketpair、信号、信号量、锁、文件锁、共享内存、消息队列。
如何分类:小数据量通信(管道、socketpair);大数据量通信(共享内存);进程间同步(socketpair/管道/锁/文件锁/信号量)。
330、问RPC的含义?IPC的含义?
答、RPC不同电脑进程间的通信;
IPC一台电脑中的进程间的通信。
331、问进程终止以后可以做哪两方面的工作?
答、回收存储区、关闭打开的文件。
332、问exit和_exit的区别?
答、_exit不执行标准I/O缓冲的冲洗操作;exit相反。
333、问spawn程序何fork及exec组合程序的区别?
答、它们都是相同的程序。
334、问strlen和sizeof执行时的区别?
答、strlen执行需要函数调用;而sizeof在编译时计算。
335、问如何确定父进程和子进程的执行先后顺序?
答、取决于内核所使用的调度算法。
336、问父进程和子进程有没有共享程序?
答、共享了正文段。
337、问ID为2的进程是什么进程?
答、内核进程,页守护进程,负责支持虚拟存储系统的分页操作。
338、问ID为1的进程是什么进程?
答、init进程,该进程通常读与系统有关的初始文件。并将系统引导到一个状态,
而且该进程绝不会终止。是用户进程,
339、问ID为0的进程是什么进程?
答、调度进程,交换进程,不执行任何磁盘上的程序,也被称为系统进程。是内核的系统进程。
340、为什么要遵守规范?
答、看起来更专业。
341、问守护进程和人有交互吗?
答、没有。不和终端关联。
342、问进程通信如果信息量大最好是什么方式?如果是小量的?
答、共享内存、匿名管道、消息队列、socketpair、
344、问文件锁的作用?
答、实现进程的同步。
345、问mac属于什么系统?
答、unix。
346、问windows有没有session的机制?
答、有。
347、问非血缘关系的进程最好的方法是?
答、mmap结合shm_open
348、问O_EXCL的作用?
答、和O_CREAT连用,如果文件存在就不创建,
349、问analogous?
答、类似。
350、问shm_open的作用?如何删除?
答、建立内存文件,与磁盘无关。
通过shm_unlink函数删除。
351、问使用mmap进行内存间通信的缺点?
答、速度慢。
352、问
dd of=share_file if=/ev/zero bs=4096 count=1;的作用
答、创建映射文件。
353、问父进程和子进程之间通过mmap交换信息通信,要注意什么?
答、父进程必须要后执行,或者谁先写信息,谁先执行。
354、问mmap的文档查看?
答、
355、问如何构建全双工机制?
答、socketpair
356、问open函数什么时候会阻塞?
答、读管道文件。
357、问创建管道文件的shell命令?
答、mkfifo a.fifo;
358、问管道是什么类型的通信?单工?半双工?全双工?
答、只能单方向通信;
可以两个方向通信,但同一个时刻只能有一个方向通信;
可以同时双方通行。
管道是单工通信。
359、问在程序中使用脚本命令?
答、FILE *fp=popen("ps aux","r");
char buf[1024];
while(fgets(buf,sizeof(buf),fp))
{
printf("buf is %s",buf);
}
pclose(fp);
return 0;
注意本程序是个范例,很多脚本语言,例如python等就是根据本原理实现功能。
360、问grep "hello world" a.txt b.txt c.txt的功能?
答、在a.txt、b.txt、c.txt中找hello world字符串。
361、问linux操作系统存放在哪个分区?
答、/dev/sda;
362、问write函数使用要注意什么?
答、1、普通文件:写入
2、管道:write会将数据写入管道,如果管道剩余空间不够,那么write将返回写入的内容长度。例如
char buf[5];但管道剩余空间为3;
int ret=write(fd[1],buf,sizeof(buf));
此时不会阻塞,直接返回3,表示buf有三个字节已经写入。
363、问read函数使用要注意什么?
答、1、普通文件:read不会阻塞,如果文件剩余的内容小于bufsize,直接返回,并将剩余内容读入buf。
如果文件剩余内容大于bufsize,那么直接读bufzie,返回。同时读会影响文件指针,如果已经到了文件末尾,返回0.
2、设备文件:读会阻塞,一直等到有数据来。
3、管道:read会阻塞,原因是等待另外一端写数据。如果write关闭,那么读会将buffer中剩余内容读取之后,最后一次返回0,表示文件末尾。
364、问如果管道读端关闭,管道如何工作?
答、管道写端是不能写的,会发出sigpipe信号。
365、问如果管道写端关闭,管道如何工作?
答、管道内如果有数据,读端会读,但是如果没有数据,读端会报错EOF;
366、问如何判断管道的尺寸?
答、如果管道满了,写时会阻塞;如果管道为空,读时会阻塞。可以是64K。
367、问read函数是阻塞的吗?
答、是。
368、问管道的本质?
答、内核内存中的存储区。
369、问free后的堆空间有没有返回给操作系统?
答、没有。
370、问如何在shell终端上查看程序的正文段、数据段、bss段的信息?
答、size /usr/bin/cc;其中第二个是要查的文件名。
371、问需要存放在程序文件中的段有哪些?
答、正文段、初始化数据段。
372、问未初始化的数据段的内容存放在磁盘上的程序文件中吗?
答、不会。
373、定义在所有函数之外的变量是
374、每个进程在运行时都有一个环境变量?那么它是怎么被表示的?如何在进程中查看环境变量?
答、对,通过字符串指针。exter char **env;通过getenv和putenv。
375、问内核使程序执行的唯一方法?
答、调用一个exec函数。
376、问sigwait函数的作用?
答、阻塞、停下;直到有信号被发出。
377、问如何查看哪些函数可以被signalaction打断哪些不能?如何查看SA_RESTART信息?
答、man 7 signal。
378、问为什么signal不能打断阻塞函数?
答、因为action.sa_flags=SA_RESTART被默认设置。
379、问切换或新开终端的快捷键?
答、ctrl + shift +n/N;
ctrl + alt + tab;稍微等会再左右键选择。
380、问如何获得当前运行的进程的文件描述符?
答、getpid();
381、问什么样的信号处理函数才会造成阻塞函数(getchar())被打断?
答、linux系统调用sigaction信号处理函数。而且信号发出必须从终端。
382、问sigemptyset(&action.sa_mask,SIGUSR1);
函数的作用?
答、屏蔽了SIGUSR1的信号。
383、问为什么有时候需要由程序员自己手动掩盖信号?
答、如果信号处理函数是不可重入的,或者如果不掩盖信息,处理信号后,影响到了其它函数的执行。
最典型的情况是信号处理函数中有全局变量。为的是避免可重入问题。
384、问
void sig_action(int v,siginfo_t*info,void *ptr)
{
printf("int signal\n");
printf("arg is:%d\n",info->si_int);
}
....
struct sigaction action;
//sa_handler和sa_sigaction只能用一个
action.sa_handler=NULL;
action.sa_sigaction=sig_action;
sigemptyset(&action.sa_mask);
// action.sa_flags=SA_SIGINFO;
action.sa_restorer=NULL;
sigaction(SIGINT,&action,NULL);
// kill(getpid(),SIGINT);
union sigval v;
v.sival_int=250;
sigqueue(getpid(),SIGINT,v);
sleep(1);
...
能不能将250传入到sig_action的info->si_int中?
答、不能。因为action.sa_flags没有设置成SA_SIGINFO。
385、问linux和windows操作系统的系统调用相同吗?
答、不同。不同操作系统的系统调用不同。
386、问signal和kill与sigaction及sigqueue的关系?
答、signal和kill是c标准中定义的信号处理函数;但是sigaction和sigqueue是操作系统提供的系统调用,
实际上signal和kill内部调用了sigaction和sigqueue进行实现。但是这是Linux操作系统的系统调用。
387、问sigqueue的作用?
答、和kill函数类似,用来发送信号。
388、问sigaction的作用?
答、和signal函数一样用来注册函数。
389、问在signal.h中sigset_t是什么类型?
答、typedef __sigset_t sigset_t;
在include<bits/sigset.h>中定义
typedef struct
{
unsigned long int __val[_SIGSET_NWORDS];
} __sigset_t;
390、问include<bits/sigset.h>
是存在bits.h和sigset.h吗?
答、错,bits是目录,sigset.h在这个目录中。
391、问strtok和readdir等函数有没有对应的可重入的版本?可重入版本是如何实现的?
答、可以,增加参数。避免不可重入。
392、问SIGINT是什么信号?
答、终端ctrl + c;
393、问
假如一个进程调用了某系统调用导致该进行处于挂起状态,而此时该进程接收到一个信号,那么该系统调用被唤醒。通常该系统调用会返回-1,错误码是EINTR。
这句话是什么含义?
答、就是本来挂起的函数例如getchar()会因为信号而被唤醒执行返回-1;
394、举出一个例子说明一个进程调用了某系统调用导致进行处于挂起状态?
答、getchar();
395、问什么是不可靠信号?
答、信号值小于32的都是不可靠信号,不可靠信号的特点是它们多次被发送但是只会被合并成一个信号。
原因是为进程保存该信号的值只有1位。
396、问信号掩码的作用?
答、屏蔽信号。
397、问398中的字段是什么?如何给字段中相应的位置信号?
答、32位的整数。通过异及移位操作(这也是)。
398、问进程的信号机制是如何实现的?
答、通过在进程的PCB中设置了用来记录信号的字段,如果有相应的信号,相应的字段位被置1,
进程根据这个字段进行信号的发射。
399、信号机制(设置处理函数)能不能实现c语言的异常?
答、可以。
400、问signal(SIGSEGV,SIG_IGN),这种写法有效果吗?
答、没有,因为SIGSEGV是不可忽略的信号。(段错误,访问非法内存发射的信号)
399、问signal(SIGINT,SIG_IGN),这种写法正确吗?
答、可以,一般要求第二个参数是函数,但是SIG_IGN作用是忽略参数1的信号。
400、问终端退出,前台进程组所有进程都会退出?
答、对。
401、问如果没有标准输入(终端),getchar函数返回什么?
答、-1;
402、问如何修改主机名?
答、hostname。
403、使用fopen进行文件读写、fgets、fputs等标准I/O会在用户区新开辟缓冲区?
答、对。
404、问行缓冲的长度一般是多少?
答、1024字节。
405、问如何获得与FILE指针所指的文件的文件描述符?
答、函数fileno(FILE *fp);
406、问如何输出宽字符?
答、格式是%lc或C;同理%ls或S也是输出宽字符。
407、问seek_end会将文件偏移量移动到文件尾部,那么着一定是文件有效数据的尾部吗?
答、不一定,因为磁盘文件都是512B的总数倍。不足是会用0填充的。
408、问fread和fwrite函数适不适合用于跨计算机系统的文件传输?如何解决
答、不适合。一是结构体数据的偏移量以及数据成员的对齐在不同系统或编译器中是不同的。
二是存储多字节整数和浮点数的二进制格式在不同机器上也是不一样的。
解决方法是使用协议。
409、问在使用fgets时要注意什么?
答、考虑最大行长。
410、问使用fopen读写文件,a或a+方式打开,问写文件时有什么特点?
答、只能在尾写(unix高级编程);而且使用a时,只能写不能读。
411、问冲洗缓冲区的命令?
答、fflush。
412、问如何为标准输入输出FILE设置缓冲方式?
答、函数setbuf、setvbuf、
413、问标准输错流有缓冲区吗?
答、没有。
414、问标准I/O的缓冲区分类?
答、全缓冲、行缓冲、不设缓冲区(字符缓冲)。
415、为什么标准I/O要设置缓冲区?
答、为了减少调用read和write函数的次数,进一步减少了内核的系统调用的使用次数。
416、问使用fopen函数有没有创建第四个结构体?
答、有,该结构体中有用于实际I/O的文件描述符、指向用于流缓冲区的指针、
缓冲区的长度、当前缓冲区的字符数以及出错标志等。
417、disposition?
答、安排、处置。
418、问signal函数实际上调用了sigaction函数实现?会打断阻塞函数吗?
答、对。不会,因为默认了sa_flags被设置为SA_RESTART;
419、问如何避免阻塞函数被打断后,还能重新运行?
答、设置action.sa_flags=SA_RESTART;
420、问goto语句,goto和
end之间能不能定义变量?
答、不能。
421、使用sigaction函数处理信号,会对阻塞函数有什么影响?
答、例如阻塞函数getchar不会执行,被跳过(打断),执行后续函数。
422、问sigaction和sigqueue函数是用来做什么?
答、处理信号和发射信号。
423、问struct sigaction结构体中,sa_handler和sa_sigaction能不能同时定义?
答、不能,这两个函数指针只能使用一个,另一个会赋值NULL。
424、问wait的非阻塞函数是什么?
答、waitpid;
425、问什么是阻塞函数?
答、执行本函数时,等待资源,不占用cpu,造成程序卡住了。
426、问信号有没有被子进程继承?信号处理函数呢?
答、没有,继承了。
427、问如何给组发kill信号?
答、kill -kill -2;
如果不加-,就是给进程;加了-就是给组。
428、问strtok和readdir是不可重入的,有没有对应的可重入的版本?
答、有。strtok_r、readdir_r;
429、问不可靠信号能不能被处理多次?可靠信号呢?
答、不能,能。
430、问进程信号记录存在,如何避免信号执行?
答、采用掩码技术,mask;
431、给出处理进程信号的函数?
答、sigemptyset;清空信号
sigfillset;置全部信号;
sigaddset;添加特定信号
sigismember;查看信号是否存在
432、问SIGSEGV信号能不能被屏蔽?
答、不能。但是可以被处理。
433、问除零,会出现什么信号?
答、SIGFPE;
434、问linux中用命令kill显示出所有信号,这些都有效吗?
答、不是,共出现64个但是不是每个都有效。
435、问空目录就完全没有任何文件吗?
答、还有隐藏文件.和..
436、windows如何进程磁盘分区?
答、
437、linux打印当天日期的命令?
答、date。
438、问如何改变文件的访问和修改时间?
答、utime函数。
439、问如何按照文件的时间进行排序显示文件?
答、ls -l或ls -t:文件的修改时间;
ls -u按访问时间;
ls -c按更改状态时间。
440、文件inode结点(i结点)中存放了哪些信息?inode结点和文件内容是分开存放的吗?
答、文件的访问权限、用户ID、链接数;对。
441、符号链接的一个重要作用?
答、将一个文件或整个目录结构移动到系统中的另一个位置。
442、对于目录,只有超级用户才能创建指向目录的硬链接?
答、对。
443、问目录中存放的是什么?
答、文件名和i结点编号。
444、问拷贝一个有空洞的文件,空洞也会被拷贝吗?
答、不会,原来有空洞的地方都会被填满,而且根据所占磁盘块数计算的字节数会比ls -l计算的要多,
这是文件系统中还要使用若干块存放四级数据块的指针的结果。
445、问在不打开文件的情况下,如何知道文件有没有空洞?
答、通过du -s core查看文件所占磁盘块数,一般是以1024或512字节为单位,并与ls -l core显示出的字节数进行比较。
注意core是文件名。
446、问进程拥有此文件是如何定义的?
答、有效用户ID等于该文件的用户ID。
447、问如何对指定的已打开的文件改变权限?
答、fchmod函数。
448、问shell的文件模式屏蔽字如何更改?如何按符号形式打印出来?
答、umask 027;
umash -S;
449、问设置屏蔽字的函数?屏蔽字的工作原理
答、umask;
任何文件mode中与屏蔽字中为1对应的位都会被关闭。
450、即使进程的权限是超级用户,也可以通过什么方法验证实际用户对文件的访问权限?
答、通过access函数。
451、问新文件的用户ID如何确定?组ID如何确定?
答、用户ID和进程的有效用户ID相同;组ID可以是进程的有效组ID也能是所在目录的组ID。
452、问有效用户ID和有效组ID是什么的性质?文件的所有者信息时什么的性质?
答、前者是进程的;后者是文件的。
453、隐藏文件是怎么办到的?
答、通过设置权限。
454、问对目录的读权限和执行权限该如何理解?
答、目录的读权限允许我们获得在该目录中所有文件名的列表;而目录的执行权限允许我们通过这条路径访问到执行的文件。例如/usr/include.c;通过路径搜索时,
需要通过目录usr找到include.c;所以又称为执行权限位为搜索位。
455、问在交互式shell(终端)上输入命令如何换行?
答、使用反斜杠\
456、问fcntl的功能?
答、改变已打开的文件的性质。
457、问为了避免内核写文件时延迟写造成的数据丢失,可以采取什么方式?
答、调用函数fsync、fdatasync、sync
458、问什么是延迟写?
答、内核会将写入的数据放在缓冲区中,等缓冲区满了以后,再放入缓冲排入输出队列,
等到达队首以后,才进行I/O操作。
459、问fork()、dup()后,文件描述符指向了同一个文件表项?
答、对。
460、问lseek修改的是什么?
答、文件表中的当前文件偏移量。没有再进行其它任何操作。
461、详细给出进程打开文件时,内核中存在的与文件相关的数据结构?
答、进程表项(有文件描述符即对应的文件指针)、
文件表(文件状态标志的记录、文件偏移量的信息、及指向的v节点指针)、
v节点表(文件的长度、i-node、对此文件进行操作的函数的指针(输入输出));
其中进程表象可以在用户区。注意文件偏移量和文件的长度等信息的分离。
文件描述符对应的文件指针指向的是文件表。
462、问ssize_t和size_t的区别?
答、前者带符号后者不带符号。
463、问read函数读成功返回什么?不成功呢?
答、0;负数。
464、什么是空洞?
答、位于文件中但没有写过的字节。@;空洞并不要求占用存储区。
465、问lseek允不允许偏移量(第二个参数)大于文件的长度?
答、允许,但是会形成空洞。
466、什么情况下,lseek的返回值是负值?
答、如果是管道、FIFO、网络套接字,会返回-1.
467、问使用kill命令杀死进程有什么条件?
答、调用者必须是该进程的所有者或者是超级用户。待验证?
468、问fork()失败返回什么?
答、返回一个小于0的数。
469、问进程有没有工作目录?
答、有,chdir()改变的是进程的工作目录。
470、问是截断还是截短?
答、截短。
471、问如何判断目录中某个文件相对首个文件的位置?如何移动readdir(dir)时的游标,
使其偏移自定距离开始读目录?
答、long loc;
loc=telldir(dir);
seekdir(dir,loc);
472、问mv命令能移动目录吗?
答、可以。
473、问如何安全地使用mv命令?
答、mv -i
474、问将不同目录中的同名文件移动到相同目录,会出现覆盖现象吗?
答、会。
475、问opendir等目录函数的使用,必须要借用stat结构体和stat函数吗?
答、对。
476、问stat函数第一个参数是什么?
答、文件的路径
477、问S_ISDIR函数如何使用?
答、S_ISDIR(buf.st_mode);其中buf是struct stat类型。
478、问虚拟文件系统中的虚拟如何理解?该系统在内核还是磁盘?
答、虚拟是指内核中存在与磁盘中类似的文件系统结构,
但是文件信息只是磁盘中的部分,这样的文件系统称为虚拟文件系统;
该系统在内核。
479、问打开目录的过程是怎样的?
答、DIR *dir=opendir("***");
struct dirent *pdirent=readdir(dir);
480、问scanf使用时有什么缺点?如何解决由scanf给代码造成的麻烦?
答、scanf无法读入空格和换行等,使用fgets(buf,sizeof(buf),stdin);
以后需要从终端输入数据时,一律使用fgets(**,**,stdin);
481、工作时,如果写了太繁琐的代码有没有影响?
答、
482、问linux上查看命令文件的命令?
答、which。
483、问回到用户的home目录的方式?即/home/lzx/
答、char *path=getenv("HOME");
484、问chdir如何使用?能不能改变终端的工作目录?
答、在自己的程序中使用,而且这个效果也只能在自己的程序中出现;
不能改变终端的工作目录。
485、问linux改变根目录的函数?
答、chroot;
486、问Linux改变目录的函数?
答、chdir。
487、问能不能通过exec族函数执行cd命令?为什么?
答、cd是linux的内建函数,找不到路径和文件名,
而exec族函数的第一个参数就是路径或文件名。
488、问
if((args[1]!=NULL)&&(strstr(args[1],">")!=NULL)&&(args[2]!=NULL))//如
重定向指令,就将信息打印到自定义文件,用dup2改变文件描述符指针
{
int fd=open(args[2],O_WRONLY|O_CREAT|O_TRUNC,0777);
dup2(fd,1);
pid_t pd=fork();
if(pd==0)
{
// execl(pstart,pstart,NULL);//execl第一个参数必须是路径名
execlp(pstart,pstart,NULL);//execlp第一个参数是命令名
printf("fork works\n");
exit(0);
}
printf("execlp works\n");
}else
{
pid_t pd=fork();
if(pd==0)
....
有什么问题?
答、父进程改变了文件描述符1内的指针,使其指向打开的文件,
造成printf打印不出来。
489、问exec族函数的作用?为什么其中有些函数存在可变参数?
答、有时候执行命令后可以接很多可变参数,例如ls -a -l;ls -al;可变参数就是这个作用。
490、问
char * Creat_Env()
{
//用当前路径名作为shell的开始
char path[1024];
getcwd(path,sizeof(path));
printf("myshell@%s >> ",path);
//输入命令
char cmd[1024];
fgets(path,sizeof(cmd),stdin);
cmd[strlen(cmd)-1]=0;//讲换行字符变成\0
return cmd;
}
有什么问题?
答、cmd是局部变量,return后函数内存会丢失,返回的是一个无效的地址。
491、问exec族函数中第一个参数分别是const char *path、const char *file,
它们分别表示什么意思?
答、file表示可执行程序的文件名字(linux上所有的命令都是存储在文件中);例如ls;
如果用 ls(ls前加了空格)是不符合file参数的规定的。同理,path是可执行程序的路径。
492、问exec族函数名后缀l、v、p、e分别表示什么?
答、l list 用不定参数列表来表示命令参数,如果用不定参数列表,那么用NULL表示结束
v vector 用数组来传递命令行参数
p path 表示程序使用程序名即可,在$PATH中搜索该程序,不带p的需要提供全路径,没有带p的要用程序的路径名。
e environ 表示环境变量
493、问execle和execvpe函数使用时要注意什么?
答、因为结尾的e表示环境变量,必须在使用该函数的程序的全局区添加exter char **environ;
494、colon-separated?
答、用冒号分隔。
495、slash?
答、斜线
496、semantics?
答、语义。
497、variadic functions?
答、可变参数函数。
498、问
int main()
{
printf("hello world");
int i=0;
for(i=0;i<5;i++)
{
pid_t pid=fork();
if(pid==0)
{
exit(0);
}
}
for(i=0;i<5;i++)
{
wait(NULL);
}
return 0;
}
打印多少个helloworld?如果hello world变为hello world\n呢?printf中的数据什么时候会被打印到屏幕?
答、5个,因为printf会先将数据存储进去第一层缓冲区,不会直接放到内核中缓冲区,fork()以后,
第一层缓冲区中的数据也会被复制,因此等程序结束时,会刷新缓冲区一次,printf会打印出结果。
但是如果是helloworld\n就不一样了,因为\n会导致printf中的第一层缓冲区刷新,
数据直接被打印到屏幕。printf中的数据在遇到\n等字符会打印到屏幕;而且所对应的main
程序运行结束也会打印到屏幕。
499、问char *name=" abcde ";
char *tmp=strtok(name," ");
printf("%s",tmp);
结果是什么?能将abcde之后的空格也清除吗?
答、abcde;
因为strtok会将abcde前所有的空格位置'\0';但是之后的空格显示出来不影响效果。
500、问uname的作用?
答、查看是不是linux系统。
501、问
int tmp;
struct student s;
int fd=open("s.info",O_RDONLY);
read(fd,&s.age,sizeof(s.age));
read(fd,&s.score,sizeof(s.score));
int len;
read(fd,&len,sizeof(len));
s.name=malloc(len+1);
s.name[len]='\0';
有什么问题?
答、没有考虑到大端和小端问题。因为在磁盘上都是按照大端方式存储;但是在内存中存在大端和小端问题。
一旦涉及到文件从不同系统之间交换文件,就一定会有大端和小端问题。
502、问如果两份程序代码内容完全一致,但是运行结果不一样,这是什么原因?
答、最可能是字体不一样。
503、问整型数据、字符型数据等,最好在一块定义?
答、对。
504、问vim如何查看关键字的信息,例如宏?
答、[再按d
即左中括号d
505、问磁盘中真正占用空间的文件有哪些?
答、普通文件、目录文件、软链接。
506、问套接字在linux中本质是什么?
答、linux文件的一种类型。
507、问大型游戏是如何做到及时地切换画面?
答、提前缓冲图片数据。
508、问qq属于c/s模式吗?还有其它的c/s模式的应用吗?
答、是。还有游戏lol
509、问实时系统如何实现?
答、信号。c语言中signal.h头文件。
510、什么是注册函数?常用的注册函数有哪些?
答、先调用函数,等程序执行到这个位置之后的某个特定的地方,再将参数传递到调用的函数,
这个调用函数代码就是注册函数。
onexit;
signal;
511、问
...
pid_t pd=fork();
if(pd==0)
{
printf("aaa");
}
wait(NULL);
...
且父进程是不停止的。类似shell
这个程序有什么问题?如何改进?
答、子进程也会调用wait(NULL);因为子进程没有它的子进程,
所以子进程不会在wait处阻塞。直接返回1;继续执行下面的代码。
但是父进程也会执行wait代码,父进程有子进程,而子进程又没有死掉,
所以父进程会阻塞,不会执行接下来的代码。如果是shell,
就会不断开辟子进程。
代码改成
...
pid_t pd=fork();
if(pd==0)
{
printf("aaa");
exit(0);
//return 0;注意return 0是不能用的,因为只会造成函数退出,不会终止进程。
}
wait(NULL);
...
512、问如何创建带空格的文件?例如aaa bbb;
答、mkdir “aaa bbb”;
513、问如何防止忘了写free()?
答、一旦写了malloc或strdup就在后添加free;
514、什么叫把标准输出重定向到文件?
答、将打开的文件的文件描述符内的指针拷贝到标准输出的文件描述符1内。
515、问linux重定向功能是如何实现的?
答、通过dup函数。
516、问exec族函数使用时要注意什么?
答、第二个参数必须要带有哨兵。例如、execvp函数的第二个参数是char *const
argv[];那么必须要让argv数组最后一个元素是NULL;例如execl函数的第二个参数是const char *arg;
arg指向的字符串最后一位必然是'\0';
517、问如何查找机器名?
答、cat /ctc/host;
518、问如果局域网冲突了怎么办?
答、windows cmd下输入命令:ifconfig /renew
519、举例说明进程组的应用?
答、qq群。
520、问什么是硬链接数据量?
答、目录链接到文件的个数。
521、问什么是虚拟文件系统?
答、内核中也建立了一套和磁盘类似的文件系统,只是只存储了部分数据。
522、问数据在磁盘上存储有没有大端和小端的概念?
答、没有,在磁盘上按从低到高存储。
523、问大端和小端是由系统中什么决定的?
答、系统分硬件系统和软件系统;大端和小端是有cpu决定。因为在最开始cpu生成商很多inter、IBM
没有一个统一的标准。所以留下了大端和小端问题。
524、怎么判断一个电脑的系统是大端还是小端对齐?
答、可以用程序判断,如下
int main()
{
int a=0x12345678;
char *p=(char *)&a;
printf("%d\n",*p);
}
525、问htons、htonll有什么作用?s表示什么?ll表示什么?htonl中的l表示什么?
答、s表示short int;ll表示长整型。表示32位整型。
526、问s.age=ntohl(tmp)中函数ntohl的作用?
答、将数据转换成小端。
527、问浮点数存储数据有什么缺点?
答、不同的机器解析浮点数是不一样的,因此让程序缺乏可移植性。
528、问单字节(字符串)和浮点数有大端小端的概念吗?
答、没有。
529、s.age=htonl(s.age);问htonl函数的作用?
答、将整型数据转换成大端。
530、给出使用open创建新文件的函数代码?
答、int fd=open("s.info",O_WRONLY|O_CREAT|O_TRUNC,0777);
531、问strdup函数的作用?
答、s.name=strdup(buf);buf是char buf[2048];s.name是char *类型
s.name首先申请了和buf大小相同的堆空间,然后将buf中的数据拷贝到s.name的堆空间。
532、问
malloc(a-1);
int b=c+a-1;
这种写法有什么不好?
答、a-1重复出现两次,应该用一个变量代替。这是为了使得代码变得更规范。
533、问
...
memset(buf,0,sizeof(buf));
int ReadLength=LengthFile>sizeof(buf)?sizeof(buf):LengthFile;
read(fd1,buf,ReadLength);
write(fd1,buf,ReadLength);
LengthFile-=ReadLength;
if(LengthFile<=0)
{
break;
}
...
这段代码有什么问题?
答、read和write的文件描述符都是fd1.
534、问如何通过文件描述符移动文件结构体中的指针指向?
答、lseek;
535、问如何在vim命令下键入man 查询命令?
答、:! man 2 stat;
注意一定要先加:!再输入命令。
536、问truncate函数的作用?ftruncate函数的作用?
答、它们都是用来截断文件(拉长文件,缩小文件);但是truncate的参数是路径、截断后大小;
ftruncate的参数是文件描述符、截断后的文件大小。
537、问
struct st
{
int a;
char *b;
}
int main()
{
}
有没有变量?
答、没有。只是定义了结构体,没有定义变量。
538、问java和javascript有没有关系?
答、它们是区别的,是两种不同的语言,而且做的事也不一样。
539、问exit函数和_exit函数的区别?
答、exit函数调用了_exit函数;_exit函数更偏向于底层。
540、问多线程和多进程的最大区别是什么?
答、多线程可以更好地共享全局变量。
541、问PCB在哪存在?
答、内核。
542、问进程的PCB是由什么代码定义的?
答、task_struct结构体。
543、问强制退出进程的最好方式?
答、ctrl+\
544、问fork为什么会有两个返回值?
答、一个是fork函数将父进程的PCB数据拷贝到子进程的PCB后,子进程被创建,
fork函数在父进程中成功执行,父进程返回一个大于0的值;
然后子进程的PCB中由于保护了现场,并从父进程的fork处进行执行,
但是fork函数只是为了增加子进程而设置,此时的子进程再执行fork,
显然是不会成功执行的,所以fork会再返回0;
545、问PCB最有特点的功能是什么?
答、保存进程现场。
546、问mylog(const char *file,int line,const char *fmt,...);//fmt的作用?
答、相当于哨兵。
547、问add(int count,int a,int b,...)count是什么含义?
答、count表示出了a,b以外还有多少个参数。
548、问能不能设置一个进程号为组长?
答、可以,通过函数setpgid.
549、问使用setsid()函数要注意什么?
答、组长不能使用本函数创建会话。且一个进程的组ID是可以变换的。
550、问创建会话的函数?
答、setsid();
551、问
int main()
{
pid_t pid=fork();
if(pid==0)
{
setsid();
getchar();
}
}
问子进程能不能接受到getchar()信息,从而控制子进程的执行?
答、不能。此处不能用getchar()代替sleep,因为getchar作用与会话,
建立了一对一的联系,但是独立过后,子进程已经不属于本会话,
所以是不会接收到这个终端上的任何人输入的信息。
552、开始执行的第一个进程会默认变成group leader吗?
答、会。
553、问领导进程(group leader)不能调用setsid函数创建一个新的session?
答、对。
554、问一个前台进程组在运行,如果用ctrl+c;这个进程组所有进程都会接受吗?
答、都会。所以都会退出。
555、问一个会话最多有多少个前台进程组?
答、一个。
556、怎样让一个程序在后台运行?
答、在末尾加上&。
557、会话的意义?
答、将多个工作囊括在一个终端,并取其中的一个工作进程组为前台,
接收人通过终端输入输出的信号,而其它工作进程组放在后台运行。
558、问用户在linux上输入信息必须要借助什么?
答、终端。
559、问终端产生的信号会传到哪?
答、用户向终端输入命令,终端将信号传递给前台进程组。
560、问会话的前台工作是什么?后台工作是什么?
答、前台工作是一个进程组;此时后台工作就是其它的进程组。
561、问终端连接的对象是什么?
答、一个会话session;
562、问关于会话session,一个工作指的是什么?
答、会话中的每一个进程组。
563、问session ID即SID是由什么决定的?
答、会话领导进程的PID;
564、问会话是由什么组成的?
答、是由多个进程组的组进程组成的。
565、问什么时候进程的组PGID会消失?领导进程的终结会不会影响组PGID?
答、进程中最后一个进程终结。不会。
566、问进程之间关系的分类是怎样的?
答、父子关系、组关系、会话关系。
567、问设置进程的组ID的函数是什么?
答、setpgid;setpgrp(视版本不同而用)
568、问int fd=open("b.txt",O_WRONLY);
如果b.txt不存在,能不能运行成功?
答、不能。
569、问exec工作之前和之后的属性哪些是相同的?
答、进程ID和父进程ID;账户相关、进程组相关、定时器、当前目录和根目录、umask、
文件锁、信号mask、未决的信号、资源限制、进程优先级、进程时间、
没有close-on-exec属性的文件描述符。
570、问execl函数的作用?
答、将运行这个函数的数据段、栈、堆等全部替换成execl函数参数中指定的
程序,但是进程属性不会改变。功能很像鸠占鹊巢。
571、孤儿进程是什么?
答、父进程死掉,但是子进程没有,那么子进程的父进程会被设置成init进程。
572、僵尸进程出现的背景是什么?在什么情况下最能凸显这个概念?
答、永不停歇的后台服务进程。僵尸进程的出现占用了内存的PCB。
573、概括wait函数的作用?
答、一、收尸;二、感知进程状态的变化。(stop-running;running-stop)
三、获取子进程的结束状态。
574、问int status;wait(&status);
程序运行成功后,status有多少位?如何得到特定功能的位号?
答、其中只有8位用于保存子进程return的值,但是其它位有其它用途。例如:WIFEXITED(status)会判断子进程有没有结束,WEXITSTATUS(status)返回的是子进程结束时return 的值。
575、md5sum file1;
md5sum file2;
问如何通过结果判断两个文件是不是相同的文件(长度、内容都相同),md5sum是什么?
答、如果是相同文件,那么它们的第一个输出结果一定是相同的。md5sum是文件指纹。
576、问一次wait能回收多少个僵尸进程?
答、一个。
577、问wait函数的返回值是什么?有什么含义?
答、表示要回收的进程的pid号。
578、问如果子进程退出,怎样防止发生内存泄漏?
答、子进程退出,父进程虽然会清除子内存的物理内存等资源,
但是子进程的PCB是不会被回收的,除非父进程通过wait函数清除PCB。
如果没有清除,那么这个子进程就会变成僵尸进程。但是如果父进程也死了,
子进程的PCB也可以被清除。
579、问linux和windows系统的最大区别?
答、windows系统的图像进程是在内核中,而linux系统的图像进程是在用户层。
580、问进程退出时,内核如何处理进程的数据?PCB也会被清除吗?
答、清除申请的内存(物理内存、栈空间、堆、代码段、数据段),
文件描述符会被关闭。它的PCB不会被清除。
581、问子进程和父进程有什么不同?
答、fork返回值、进程ID、父进程ID、程序运行时间记录,在子进程中被清零、
文件锁没有被继承、闹钟、信号集合。
582、问通过什么机制可以实现进程间通信?
答、mmap;内存映射。
583、简述子进程继承了父进程的哪些属性?
答、文件描述符、账户/组ID、进程组ID、会话ID、控制终端、set-user-ID和set-group-ID、
当前工作目录、根目录、umask、信号掩码、文件描述符的close-on-exec标记、
环境变量、共享内存、内存映射、资源限制、
584、问使用fork函数创建子进程,子进程中会和父进程公用相同的变量吗?例如int a;如果是文件描述符呢?
答、不会,但是如果是文件描述符,它们是共用同一个打开的文件的。
585、问在Linux上执行程序,有没有通过fork()函数?
答、有。
586、问fork()函数的返回值是怎样的?
答、fork()函数会返回两个值;当值大于0时,表示的是父进程;当值小于等于0时,表示的是子进程。
587、问fork()函数的功能?
答、fork可以在内核中拷贝一份与原进程相同的PCB,既然是正在运行的PCB,就一定会执行。所以通过这种机制创建了子进程。
588、问fork()后的子进程会不会再执行父进程fork()之前的代码?
答、不会。
589、问理解进程要从哪几个方面理解?
答、进程属性、进程控制。
590、问linux的账户功能是怎样的?
答、账户是一个数据结构,功能主要体现在进程上,进程中会有账户属性,
这个账户属性可以赋予进程操作文件的权利。
591、问printf(“%s %d”,a,b);
哪个是printf的哨兵?
答、%号。
592、问什么是前台进程?
答、能捕获到用户输入的进程。
593、问main函数为什么要返回return 0?
答、第一、return 的结果会被保存在PCB中,让main函数的父进程知道。否则这个main函数对应的PCB中的return值是未知的。
第二、有时使用了on_exit函数,需要根据return的值进行调用,
如果没有return返回值,或者exit(1)等能够返回到PCB的值,
这个函数就不会被调用。注意到main函数执行时的程序是一个子进程,
它是由父进程调用的,子进程运行结束,必须返回值给它的父进程,
不然父进程不知道,而且这个值也会被保存在内核的该进程的PCB中;
如果异常退出,应该避免程序的异常退出。
594、问进程的结构体中有没有环境变量?子进程会继承父进程的环境变量吗?
答、有关于环境变量的信息。会继承。
595、问文件结构体和文件描述符的区别?
答、每打开一个文件,都会为磁盘上的这个文件创建一个结构体,而文件描述符属于进程,
里面的指针,指向了文件结构体。
596、问windows上操作目录的函数的头文件?Linux呢?
答、direct.h;
dirent.h;
597、问杀死进程的命令?
答、kill -kill +进程号。
598、问如何在全局区申请内存?
答、brk;
599、问获取当前目录的命令?设置当前目录的命令?修改当前目录的命令?
答、getcwd;chdir;chroot;
600、问如何保证窗口关了以后,程序任然能够执行?
答、设置程序的session号。
601、问子进程的父进程死掉了,子进程的父进程号还会是父进程的进程号吗?子进程的组ID会改变吗?
答、不是,会选择一个程序的进程号作为父进程号。不会。
602、问int a=100;
int arr[a];能不能在linux上定义成功?
答、可以。
603、问alloca申请的内存在哪?
答、栈。
604、能不能用mmap申请内存?
答、能。
#include"../header.h"
int main()
{
void *ptr=mmap(NULL,
4096,
PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANON,
-1,
0);
strcpy((char *)ptr,"hello");
}
605、给出制作静态库及使用的过程?
答、①、先编写好静态库代码,例如607中的lib.c;
②、ar rcs libmylib.a lib.o生成相应的libmylib.a文件
③、编写测试代码,例如607中的ICE7.c;
使用命令gcc ICE7.c -lmylib -L. -static;
606、问export LD_LIBRARY_PATH.设置环境变量的有效期是怎样的?如何保证在任何新开的终端都有效?
答、只能在当前终端有效。在其它终端不行。
可以在/etc/profile中设置。
607、简述动态库的制作及使用过程?
答、①、写出动态库的代码,注意不能有main函数;例如lib.c
#include<stdio.h>
int a;
int main()
{
prinf("abcd");
}
②、在shell中使用gcc -shared -fpic -o libmylib.so lib.c;生成libmylib.so文件,动态库已经制作完成
③、使用过程如下:在程序中
用extern进行声明(提示存在函数,不过是在其它文件中);动态库中定义的全局变量也要通过这种方式声明;例如ICE7.c
例如extern void foo();
extern int a;
int main()
{
a=100;
foo();
}
④、使用gcc ICE7.c -L. -lmylib编译写好的程序;其中-L.提示在当前路劲寻找动态库,在当前路径寻找程序之前,
要在环境变量中寻找,没有找到才能在当前路径中寻找;编译成功后进行下一步。
⑤、使用export LD_LIBRARY_PATH=.将④中生成的a.out文件的路径加入到环境变量中。
⑥、
608、问如何将后台的程序调到前台?
答、fg 1;
609、问如何查看在后台中的程序?
答、jobs;
610、问如何将前台进程切换到后台?
答、ctrl + z;
609、问什么是前台进程?
答、输入cat以后,再输入,此时cat就是前台进程。
610、问ps aux命令后,进程的状态显示Ss,这个进程是什么进程?+号表示什么?
答、这个进程是会话组的领导进程。+号表示进程是前台进程。
611、简述进程的状态?
答、6种:可运行状态、中断等待状态、不可中断等待状态、僵死状态、停止状态、交换状态
612、环境变量的结构?
答、等于号左边是变量后边是值。
613、问进程的账户和组带给了进程什么功能?
答、这个进程的权利(能否操作其它用户进程和文件)。
614、问进程编号会不会按降序分配?类似进程的文件描述符?
答、不会。
615、问虚拟地址映射的物理内存,一块的单位是多少?
答、4k。
616、问有没有进程不占cpu?
答、getchar();
617、问两个不同进程之间传递地址有没有意义?
答、不能传递成功,因为它们是虚拟地址。
618、给出task_struct的位置?并说出作用?
答、task_struct在文件/usr/src/linux-headers-3.13.0-119/include/linux中,文件是sched.h。
进程根据task_struct初始化进程的PCB。
内核为每一个进程创建管理程序时必须要用到。
619、问在当前目录找文件的命令?
答、find -name “linux”;
620、问内核是通过什么来控制进程?
答、PCB。
621、问进程的状态在哪?
答、在ps -aux命令或ps -ajx命令执行后显示出来。
622、问终端是什么?
答、一个程序。
623、问linux的内核进程启动后再执行什么程序?
答、必定会执行init程序。
624、问操作系统在未开机前,数据存储在哪里?开机的作用?
答、硬盘上。开机就是将操作系统从硬盘转到内存上。
625、请简述linux上一条命令时如何被执行的?
答、首先shell进程会告诉内核命令的文件位置,然后内核调用文件,并执行;
626、问atoi函数使用时,能不能要求buf中有换行符?
答、不能。
627、fgets(buf,sizeof(buf),fp);
mkdir(buf,0777);
问有什么问题????
答、没有考虑到fgets回
628、问Linux的目录能不能有换行符?
答、不能。
629、问如何删除目录及目录中的文件?
答、rm -rf c;其中c是要删除的目录名。
630、问管道的作用?
答、将前面的输出当做后面的输入。
631、问printf中有没有调用系统调用?
答、有。
632、问加了中括号的进程是什么进程?
答、内核进程。
633、问进程结构是怎样的?
答、树型结构,除了init之外的每个进程都有一个父进程。
634、问指针变量保存的是什么?
答、虚拟地址。
635、问PCB的作用?
答、描述进程的属性和状态。
636、问PCB是哪个单词的简称?
答、process control block;
637、问单独的ps查看什么信息?
答、当前终端的进程。
638、问ps是哪个单词的缩写?
答、process status。
639、问linux上的第一个用户进程是什么?
答、init进程。
640、问shell是不是内核程序?
答、不是。但可以和内核互动。
641、问stat函数如果运行失败,返回什么?
答、-1;成功返回0;
642、问能不能通过opendir函数判断文件类型(目录文件还是普通文件)?
答、不能,必须通过stat函数。
643、给出常用的操作目录的函数?
答、opendir、closedir、readdir、rewinddir;
644、问mkdir c/b -p的作用?
答、如果目录中没有c目录会自动添加c目录后,再在c目录中添加b目录。
如果不加-p;就不能创建,会报错。
645、问unlink和rmdir也是函数吗?
答、是。
646、给出删除文件的两种方法?
答、unlink a.txt;
rm a.txt;
647、file结构体里存储了文件描述符信息?
答、对。
648、问什么时候a.out要加上sudo?
答、当a.out文件涉及到修改文件的属性时,因为文件的属性往往存放在内核,
所以要用root权限修改。
sudo ./a.out.
649、问如果abc->bbb;
文件abc是文件bbb的软链接,那么stat abc出现的文件信息时链接文件还是被链接文件?
答、链接文件abc。
650、问隐藏的文件通常有哪两种?
答、.和..
651、问inode结构体有没有限制?可以无限多吗?
答、有限制,不能无限多。
652、目录文件的数据域存储的是什么信息?
答、inode number以及目录中的文件名。
653、inode的本质?
答、结构体。
654、问inode空间大小只有128-256字节,其中除去记录文件信息的结构体大小,
剩下的空间都用来存放指向数据信息的指针,而磁盘本身不是线性的,
所以inode中指向数据部分是通过指针的方式,那么如果inode空间不足怎么办?
答、inode会采取二级指针或多级指针的方式进行数据存储;借用二级指针去理解,
就是inode会拿一个指针区域指向一个数据区域,而这个数据区域内存放的都是inode指针,
指向其它的数据块。借此扩大了存储空间。同理三级指针和四级指针也是如此。
655、stat里面存储的信息和inode的关系?
答、实际上stat结构体里面的信息都是inode里面的。
656、问inode标识的结构体存放在哪?
答、磁盘。
657、给出改变文件长度的方法?
答、write、truncate、st_size保存文件的长度。
648、给出得到文件长度的方法?
答、ls、wc -c、stat;
649、能不能去掉/tmp目录的stickbit位?
答、不能。因为tmp是公共目录,去掉会不安全。
650、添加用户的命令和删除用户的命令?
答、adduser和useradd;增加。
userdel删除。
651、问stickbit的作用?如何设置?
答、如果对文件设置这个权限,当文件运行退出后,系统中仍然有该文件的映像,再次运行时,不需要加载;
但是占用了内存。但是如果是对目录设置了这个属性,用户只能删除和修改它自己创建的文件,
对于其它账户创建的文件,它不能修改和删除。特别是公共目录,一般有这个属性。例如/tmp;
chmod o+t;
chmod o-t;
652、问如何设置文件的用户和文件的组?
答、shell命令sudo chown lzx:root dir2;
653、问chmod u+s dir2命令有什么问题?改正后,有什么效果?
答、没有加sudo;所以是无效的。再通过sudo chown lzx:root dir2;
(可以将dir2文件变成所有者lzx;组用户名root;那么在这个目录下创建
的文件组用户都是root;
654、问用户和组是什么的属性?
答、进程。
655、问如何查看账户的信息?如何查看密码?
答、cat /etc/passwd;其中密码都用x表示。
想要查看这里面的密码信息,必须先查看shadow;可以通过cat /etc/shadow;
查看shadow文件的权限等信息。结果显示只有root用户可以对shadow
文件进行写操作,这个时候,必须用命令ls -al /usr/bin/passwd
查看平时改root密码时使用的命令passwd(通过which passwd可以得到
这个路径),就能看到s权限被设置(USID);有没有觉得奇怪,
改密码可以用普通账户修改,但是只有root账户可以向管理密码账户
的文件中写信息?说明passwd命令被提升成了root权限。
656、如何安装vim插件?
答、sudo apt-get install ctags;
在工程目录下执行vim,并ctrl+p;生成tag文件;
ctrl+o,显示目录树。
光标停在函数处,用ctrl+],跳转到函数的定义(无论在不在新的文件都可以),然后按ctrl+t可以返回。
按F4,出现标识符导航。
ctrl + p是补全提示。
:A在相应的.cpp和.h之间进行替换。
:AV同时打开.cpp和.h文件。
657、如何在两个分屏间进行切换?
答、ctrl + w +w;
658、问linux分屏时如何将已有的文件加入新开的分屏?
答、:split a.txt;
659、问linux的分屏快捷键?
答、:split;命令行输入。竖向分屏:vsplit;
660、问linux执行外部的shell命令的快捷键?
答、冒号加感叹号;:!ps aux;命令行输入
661、问如何从反向搜索字符串?(头文件是string.h)??
答、rindex;
662、问修改目录的函数?
答、chdir;
663、问打包文件要不要将隐藏文件考虑进去?
答、要。
664、给出文档替换字符串的命令?如果被替换的字符是特殊字符怎么办?
答、:%s/worldx/xxxxyyy/g;
如果是特殊字符,要用\转义。
例如将/替换重abc;
:%s/\//abc/g;
665、问如何快速查找文档中出现的world单词?快捷键是什么?
答、光标移动到单词,按#号就能以不同的颜色显示出所有world单词。
按n(N)可以在这些world单词中切换;也可以在命令行中输入/world进行查找;
666、问Linux快捷键剪切?粘贴?复制?剪切单词?复制单词?撤销和反撤销?替换字符?删除字符?
删除连续的多行?
答、dd;p;yy;(三个都是行);dw(具有自动判断单词的功能);yw(复制单词);
u是撤销;ctrl+r是反撤销。r(替换字符,不进入编辑模式);R(替换字符,
并进入编辑模式);x删除字符;3dd或d3d删除连续的多行(从光标开始);
yy和dw以及yw和x前都可以带上数字,用来表示同时操作多个数据,
且数字可以在中间。
667、linux快捷键如何移动到文本行首?如何移动到文本行尾?如何跳转到
指定行?
答、gg、G;在下面输入:6;其中6是指定行;
668、问linux快捷键如何跳到行尾?如何从行尾跳到行首?
答、命令模式,按下A;
命令模式,按下I;
669、问查看系统核数的命令?
答、cat /proc/cpuinfo | grep processor | wc -l
670、问查看某个目录下有多少个文件的命令是?
答、ls | wc -l
671、linux的哲学是小的就是美的。这种哲学是如何体现的?
答、从shell命令可以看出来;
cat /proc/cpuinfo | grep processor | wc -l
672、问long型的数据,用什么格式符输出?
答、ld。
673、问rewinddir的作用?
答、读目录中的文件信息后,可以在过程中将指针设置到开头,再读目录中的
文件信息一次。
674、问.和..开头的是什么文件?
答、隐藏文件。
675、问如何使vim文档规整?
答、光标移动到开头gg -G;
676、问文件名是不是文件的属性?
答、不属于,属于目录的信息。
677、问打开目录的函数?
答、opendir。
678、问mkdir c/b -p作用?
答、创建多层目录。
679、问删除文件的命令?
答、unlink;但是该命令不能删除目录;删除目录是rmdir。(但是只能删除空
目录)
680、不同的进程打开相同的文件,什么是一样的?
答、inode。
681、问简述打开文件的工程?
答、文件描述符指向了inode,inode指向了包含文件的信息的结构体。
682、文件描述符实际上是什么结构体的下标?
答、文件结构体。
683、问cpu中存储数据的装置有哪些?
答、寄存器、l1、l2、l3(cache)
684、问cpu能不能访问硬盘?必须通过内存?
答、不能。内存
685、给出伪造文件时间的函数?
答、utime。但是文件属性的修改时间不能改变;只能改变内容访问时间和内容
修改时间;
utimes;可以精确到毫秒。
686、问创建链接的函数?
答、link;会导致引用计数加1;硬链接
symlink;软链接。
687、问检查文件能不能被读写执行的函数?
答、access。
688、struct stat buf;
stat(“dir2/abc”,&buf);
printf("%d\n",(int)buf.st_ino);
其中abc是软链接。链接到aaa文件
问打印的是链接到的文件,还是软链接本身的文件?
答、链接到的文件,和shell命令中的stat结果是不一样的。这种现象叫做跟随。
但是将代码中stat换成lstat;就能打印软链接本身的文件信息。
689、问如何查看链接文件的链接路径?
答、readlink abc;
690、问stat 软链接文件,得到的是被链接的文件属性,还是链接文件属性?
答、链接文件属性。
691、问inode的字节数?
答、128或256;
692、软链接是如何实现的?
答、软链接是一个文件,有自己的inode,数据块中保存了一个路径。
693、问如何查看软链接和硬链接的引用计数信息?
答、ls -al;软链接不改变引用计数。
694、问软链接有没有分区和目录限制?
答、没有,都可以。
695、问能不能跨分区进行硬链接?为什么?
答、不能。一个简单的理由是因为不同分区存在相同的inode号;所以不能区分
是本分区还是其它分区。
696、问目录能被硬链接吗?
答、不行。
697、ln -s file1 file2中的s的含义?
答、soft;软的。
698、问硬链接的命令?
答、ln file1 file2
699、能不能通过ls -al查看inode被引用了多少次?
答、可以。在权限信息后。
700、问有没有可能有多个数据块记录了同一个inode信息,指向同一个inode?
答、有可能。
701、问目录项和目录项之间通过什么划分?
答、/
702、问什么是map表?
答、记录了inode有没有被使用的表。
703、问目录有没有inode?
答、有,inode指向的数据块存放了文件名。以及文件的inode。
704、问文件是如何拓展的?
答、通过二级指针、三级指针进行拓展;
705、问文件名存放在哪?
答、文件所属的目录文件中。
706、问extern4中数据块的大小单位?
答、4k。
707、硬盘的结构是怎样的?
答、分成两个部分,一个部分存放着管理信息如inode;另一个部分存放着数据信息。
708、boot block?
答、启动块。
709、问文件系统的功能是什么?
答、在线性存储空间(硬盘)中,实现树形的数据结构。
710、问wc -c file是什么命令?如果在程序中呢?
答、查看文件的单词数,有多少个字符;
wc -l file:类似,查看多少行。
fseek和ftell;stat;lseek都可以。
711、问cd -是什么命令?
答、返回到上次的目录;但不能返回超过两次,而且只能在最近的两次间进行切换。
712、问/tmp/目录的特点?
答、目录其它用户权限位存在权限t;造成不同用户在这个目录中创建的文件是安全的。
其它用户不能删除这个文件。
713、问SGID设置的是什么?
答、类似SUID,不过设置的是组上的S、s信息。而且只能设置目录;设置后,
在该目录中创建的文件的所有组是root。
714、问ls -al后出现的文件详细信息中,有那两个所有信息?
答、用户、组
715、问which查看命令的路径功能又什么作用?
答、which查看命令的路径后,可以用ls -l +路径;就能知道文件的权限情况。
716、问密码在哪个文件?
答、/etc/shadow
717、问如何确定进程的账户?
答、谁执行了这个进程,这个进程就属于谁。
718、问文件的权限包括哪几种?
答、文件所属的账户(可以通过chown改变)、执行该文件的进程的账户
719、问SUID是什么?如何设置?如何取消?
答、文件的权限与r、w、x权限相似;一般启动的进程就是执行进程的用户;
而不是文件的所属账户;但是设置了suid后,启动的进程属于文件所属的账户,
而不再是执行进程的程序;即(进程中的进程所属信息不再像常规一样)
chmod u+s a.txt;
结果可能是类似-drS或-drs(如果是S,说明该位置对应的执行权限是没有的,
反之如果是小s,执行权限是有的)
chmod u-s a.txt;
720、问如何确定文件的所有者?
答、哪个用户的进程创建了文件,这个文件就属于谁。
721、linux中有哪些文件是存放在硬盘中的,真实存在的?
答、普通文件、目录、链接。
722、问execlp函数中的p的含义?
答、在PATH的环境变量中寻找程序。
723、问int fdo=open(dstfile,O_WRONLY|O_CREAT,0777)?
有什么问题?
答、没有考虑到文件存在时本函数不能用,应该改为
int fdo=open(dstfile,O_WRONLY|O_CREAT|O_TRUNC,0777);
724、问进程控制块PCB在哪?
答、内核。
725、什么函数可以改变根目录?什么时候可以改?
答、chroot();在系统中构建子系统,
726、什么函数可以改变程序当前运行的工作目录?
答、chdir();
727、问cd的全称是什么?
答、changedirectory;
728、问如何知道程序运行了多长时间?
答、time ./a.out test aaa;
729、问文件描述符在哪?
答、进程控制块。
730、问切换进程到后台运行的命令是什么?又该如何换回?
答、ctrl z(中断显示^z);fg 1可以换回。
731、给出查看环境变量的两种方式?
答、vim /etc/profile;
vim ~/.bashrc
732、问sudo chmod u+s a.out的作用?
答、改变a.out的文件权限-rwsrwxr-x;使得文件是属于用户的,但是执行是按root用户执行。
734、问如何查看用户的id信息?
答、cat /etc/passwd;
735、问进程号从什么编号开始?
答、1、不是0
736、问如何查询cpu的核数?
答、cat /proc/cpuinfo | grep processor
如果结果是processor:0也没关系;因为0表示0号说明有1颗cpu。
737、问编译形成的a.out文件在哪?
答、磁盘。
738、问
int data[1024*1024];
int main()
{
return 0;
}
编译以后,形成的a.out文件的大小有没有将data数据的大小包含进入?
如果data[1024*1024]={1}呢?有什么启发?
答、没有,因为此时的data数组放在全局区bss段,只是被告知存在这样大小的数据。
此时a.out文件所占的磁盘空间是不大的。但如果是后者文件大小就包含了data
数据的大小。显然占用了更多的磁盘空间。所以最好不要初始化。
739、为什么进程要用虚拟地址?
答、为了防止进程直接访问物理内存,起隔离作用;
不然操作系统会被搞死。
740、问查看用户进程的命令?
答、ps aux;更详细的命令时ps ajx | more。
741、问realpath的作用?
答、得到相对路径的绝对路径。
742、builtin?
答、内键指令。
743、什么是linux内置命令和非内置命令?如何查看?
答、能通过which查找出路径的就是非内置命令ls;
反之就是内置命令(cd)。
可以通过type命令查看,例如
type cd;
747、问/dev/null文件是什么文件?
答、可写文件,无论什么数据写进这个文件,数据都会被丢弃。
作用,可以重定向1号文件描述符,到这个文件,打印10000个printf,
使所有printf无效。
748、问/dev/zero文件是什么文件?
答、只读文件。永远不会读完,而且数据都是零;作用是初始化。
749、问如何使用dd拷贝文件?
答、一、dd if=/dev/sda1 of=aaa bs=1k count=10;
将sda1分区中的数据拷贝100k到新文件aaa
二、dd if=day01.tar.gz of=xxx
从文件day01.tar.gz中所有信息拷贝到文件xxx;
750、问删除文件的命令rm实际上是调用了什么?
答、unlink和rmdir。
751、用ln创建硬链接或软链接的区别是什么?
答、加-s能创建硬链接,不加是软链接。
752、问硬链接是普通文件吗?
答、是。
753、问time_t是什么类型的数据?
答、32位的整数。
754、问怎样通过写代码改变文件时间?
答、函数utime。
755、说出touch的两个作用?
答、改变文件的三个时间;创建文件。
756、问删除目录的命令?
答、rmdir。
757、问删除文件的命令?
答、unlink。
758、问不同分区的文件能够建立硬链接关系吗?
答、不能。
759、问目录能允许被硬链接吗?为什么?
答、不能。如果目录可以,容易造成死循环。
760、问linux上如何在用vim打开时就能跳到指定行?
答、vim a.c +33;
761、问linux上如何查找?
答、命令下输入/+查找内容。
762、举出块设备的例子?
答、磁盘。
763、问如何选择open和fopen?
答、选择fopen,因为跨平台。
763、问如何在/dev/zero/目录下,创建一个所有权是a,块大小是1k,总共是4块的文件?
答、dd if=/dev/zero of=a bs=1k count=4
764、问linux中磁盘名一般是怎样的?
答、sda、sdb
765、怎样知道cpu的核数?
答、cat /proc/cpuinfo | grep processor | wc -l;
766、问线程的数量多少最合适?
答、cpu核数的两倍。
767、如何查看Linux的版本信息?
答、cat /proc/version
768、接口的本质是什么?
答、某个物与另外一个物之间交换信息时的机制。(当然是因为它们不能直接交换信息啦);
769、问如何查看磁盘信息?
答、cat /proc/diskstats
770、lib64、mnt、root、srv、usr、boot、etc、lib、lost+found、opt、run、sys、var、cdrom、home、media、proc、sbin
问给出里面存放的内容?
答、
lib64(64位)的库、mnt(挂载设备)、root超级用户的工作目录、srv用的比较少一般是空的、usr里面有一些目录包括bin目录,
该bin目录中存放vim等非系统程序,另外一些库文件(例如c语言的include)也会在usr库里、boot是启动目录、
etc存放配置文件(.conf、/etc/profile)的目录、lib库(一般usr目录里的lib库中的文件使用最多)、
opt可有可无的、run服务程序、sys设备、var(文档例如网页)、cdrom(光盘)、home(Linux)账户们(lzx、
xzl)工作目录(lzx、xzl)、media(多媒体例如u盘)、proc(内存目录像CPU、内存、磁盘的配置信息)、
sbin(服务器程序,后台持续运行的bin,s表示system系统的意思)
771、问根目录下initrd.img和vmlinuz是什么文件?
答、为linux启动服务。它们是软链接。
772、问bin中一般存放什么文件?如何检测?
答、二进制文件、可执行文件
命令ls ls;
命令 which ls;
773、chmod除了是shell命令,还能是什么?说明什么?
答、系统函数。说明linux上很多shell命令还能是函数。
774、问linux上用来测试文件的权限位的宏有哪些?如何使用
答、S_IRUSR//用户读
S_IWUSR//用户写
S_IXUSR//用户执行
S_IRGRP//组内读
S_IWGRP//组内写
S_IXGRP//组内执行
S_IROTH//其它用户读
S_IWOTH//其它用户写
S_IXOTH//其它用户执行;
以上这些是宏,通过与stat结构体中st_mode相与得到结果。
775、对于跨用户的文件,可以怎样读写?
答、通过root用户读写。
776、问stat结构体中,判断是不是普通文件的函数是什么?判断是不是目录文件的函数是什么?还有哪些判断文件类型的函数?
答、S_ISREG(buf.st_mode);
S_ISDIR(buf.st_mode);
S_ISCHR();//字符设备
S_ISDLK();//块设备
S_ISPIPO();//管道文件
S_ISLNK();//符号链接设备
S_ISSOCK();//套接字文件。
其中参数都是buf.st_mode.
而buf.st_mode是结构体中的数据成员。
777、问stat结构体中,buf.st_mode中有保存文件的权限信息(rwx)吗?还保存了什么?
答、有,后9位就是;还保存了文件类型。
778、问获得文件信息的命令?
答、stat file;其中file是文件名。
779、问硬盘里有管道文件吗?
答、没有。
780、问创建管道文件的命令?
答、mkfifo file;file是创建的管道文件名。
781、设备文件放在什么目录下?
答、根目录下的dev。
782、什么是字符设备?
答、鼠标和键盘设备称为字符设备。
783、问什么是符号链接?
答、又称为软链接,符号链接是在当前目录创建另一目录下的文件的链接。文件名一样,
但是实际上这个文件是指向另一目录下的文件。另一个目录下的文件被删除后,
这个链接文件是无效的。
784、问如何进入根目录?
答、cd /
785、如何查看cpu的信息?
答、cat /proc/cpuinfo;
786、根目录下有/proc文件目录,问它在硬盘上吗?/dev呢?
答、不在。是假目录,也不在,是个假目录。
787、问如何查看所有挂载的文件信息?
答、shell命令mount。
788、怎样保证挂载的文件目录和磁盘不会因为系统重启而出现失效?
答、在/etc/fstab中添加语句
/dev/sdb1 /home/lzx/mount-dev-sdb1 ext4 errors=remount-ro 0 1;
即可。
789、问当系统启动时,/etc/profile文件会自动执行?
答、对,如果在里面添加touch aaaxxxxx;重启后就能在桌面看到aaaxxxx文件。
790、问某文件与某磁盘分区挂载,重启后,它们还是挂载状态吗?
答、不是。系统重启后就会消失。
791、问目录中的lost+found文件是用来做什么的?
答、一旦断电,可以通过这个文件找到原来未写入的信息。
792、问拓展分区能不能被格式化?
答、不能。
793、问拓展分区中能不能再划分成主分区或逻辑分区?
答、可以。
794、问拓展分区有什么特点?和主分区之间的关系?
答、且拓展分区只能有一个,但是主分区和逻辑分区可以是多个,一般拓展分区会紧接着主分区开始;
795、问如果在一个目录A下,存在某个目录B挂载的磁盘,正好是用来备份文件的目录挂载的磁盘,
问在A目录下用命令rm -rf删除目录下的所有文件,用来备份文件的目录中文件会发生什么影响?
答、用来备份文件的目录也会被删除。
796、问存在两个目录,它们挂载的磁盘都是相同的,则两个目录中
的文件内容是相同的吗?
答、对,且在任意一个目录中增加新的文件,在另一个目录中也能查看到。
797、问如何实现指定的磁盘分区与指定的文件目录之间挂载?让指定的文件目录下创建的文件
全部存储在指定的磁盘分区中(挂载的作用)?
答、①、创建要挂载的目录,例如mount-dev-sdb1/;②、不进入目录,参考如下命令输入命令:sudo mount
/dev/sdb1 mount-dev-sdb1/;③、测试:先不进入目录,改变目录的权限777;
再进入目录,touch创建文件。
798、问格式化磁盘的命令?
答、sudo mkfs.ext4 /dev/sdb1;
799、给出磁盘分区出主分区的操作过程?
答、视频(day02 10、磁盘管理命令);
①、shell 命令sudo fdisk/dev/sdb;注意如果sdb改为sda会出现格式化操作系统情况,破坏了操作系统;②、输入m查看帮助;③、输入n,进行分区;
④、输入p,开始主分区操作;如果输入的是e,表示分区成拓展分区⑤、
根据提示选择分区的开始号(按512B为一个单位);⑥、根据提示选择
分区的结束号(按512B为一个单位),也可以通过+5G的方式确定;⑦、输入p键;
⑧、输入w键。
800、linux上查看磁盘信息的命令?
答、fdisk。
sudo fdisk -l。
801、给出在ubuntu上为操作系统加快硬盘的方法?
答、①、先关机;②、在设置中,选择设备处的硬盘,再点击添加,按步骤进行下去。
802、问硬盘的读取单位为什么是512Byte?
答、因为硬盘容量一般比较大,往往超过100GByte,而32位计算机系统,按字节最多可以区分4G,
是不同区分硬盘的,为了区分硬盘,选择512Byte作为读取的单位。
803、问shell获得系统配置的命令时什么?
答、getconf;例如getconf -a;对应 sysconf
804、问怎样改变文件中的open files信息的数量?
答、ulimit -n 1000;例如
805、问怎样获得文件的限制信息?
答、ulimit -a;
806、问Linux上读取文件系统配置的函数是什么?
答、sysconf。
807、问文件除了要存储文件本身的数据外,还要存储什么?
答、时间撮,等文件的一些属性
808、给出刷新缓存的函数?它们刷新哪里的缓冲是用户还是内核?怎样刷新用户区的缓存呢?
答、void sync(void);
int syncfs(int fd);
int fsync(int fd);
int fdatasync(int fd);(只刷新文件的data)
内核。
fflush;
809、问如何定义临时文件?
答、int main()
{
char tmp_path[256];
strcpy(tmp_path,"/tmp/save_the_world_xxxxxx");
mkstemp(tmp_path);
printf("%s\n",tmp_path);
}
810、问linux的目录/tmp/任何用户都能写,这句话是对的吗?
答、对。
809、问linux的临时文件目录是什么?
答、/tmp/
810、问如果将811中的int flags=MAP_SHARED改为int flags=MAP_PRIVATE;再添加语句strcpy(ptr,"*****");
编译能不能成功,执行能不能成功,效果如何?
答、能成功,能成功,效果不能实现。
811、给出创建文件映射机制的方法?
答、首先必须用shell命令创建出指定长度的文件,然后
在.c文件中写程序,代码示例如下:
#include"./header.h"
int main()
{
void *addr=NULL;
size_t length=4096;
int prot=PROT_READ|PROT_WRITE;//protect
int flags=MAP_SHARED;
int fd=open("a.txt",O_RDWR);
off_t offset=0;
char *ptr=(char *)mmap(
addr,
length,
prot,
flags,
fd,
offset);
strcpy(ptr,"hello shenzhen");
munmap(ptr,length);
close(fd);
}
创建了a.txt文件作为4096大小的磁盘的文件映射,并被写入"hello shenzhen";
812、问用shell命令给出创建指定长度的文件的命令?
答、truncate a.txt --size=4k;
或dd if=/dev/zero of=a.txt bs=1024 count=4;
813、问在linux中O_RDONLY、O_WRONLY、O_RDWR的预定义常数是什么?
linux中O_APPEND、O_WRITE、O_READ的预定义常数又是设么?
答、#define O_RDONLY 0;
#define O_WRONLY 1;
#define O_RDWR 2;
分别是1、2、4;
814、问利用fcntl函数增加open函数的属性,有哪些限制条件,代码格式是怎样的?
答、对于像O_RDONLY,O_WRONLY,O_RDWR,O_CREAT,O_EXCL,O_NOCTTY,O_TRUNC是不能通过fcntl添加属性的;
但是O_APPEND,O_ASYNC,O_DIRECT,O_NOATIME,O_NONBLOC才可以。
815、问什么是原子操作?
答、原子操作就是不能被破坏的程序执行,注意程序可以是类似加了O_APPEND的write函数一样的程序。
816、linux函数都是通过文件描述符操作内核中的结构体的?
答、正确。
817、问fd2=dup2(fd,5);如果fd2,fd是打开状态,这个程序时运行的吗?是安全的吗?
答、是允许的,是安全的。因为付过fd2,fd所指向的文件是打开的,dup2会关闭该文件,并使得fd2存储文件描述符5,而该文件描述符
指向的文件结构体是由fd变量存储的文件描述符指向的文件结构体拷贝过来的。
818、问fd2=dup2(fd,5),fd2是fd还是5?
答、5。
819、问dup的参数文件描述符和dup函数返回的文件描述符值是不是相同的?
答、不是。
820、int fd=open("a.tmp",O_RDWR);
int fd2=dup(fd);
问fd和fd2相不相同?
答、不相同。
821、问dup的作用?
答、根据文件描述符拷贝将文件描述符指向的文件结构体拷贝到另一个文件描述符指向的文件结构体。
822、问O_EXCL能不能单独使用?
823、使用Linux的系统函数open时,O_TRUNC参数是用来做什么的?
答、如果文件存在,清空文件内容。
822、问在linux上使用int ret=open("a.txt",O_WRONLY);
write(ret,"hello",5);
如果a.txt文件存在,会怎么执行?,如果文件不存在呢?
答、会覆盖原文件中的信息。如果文件不存在会报错。
823、问写文件时使用open函数,采用什么方式,可以避免打开相同的文件时造成写文件发生覆盖问题?
答、添加open函数。
824、问如何转到root用户?
答、首先要保证设置了root权限的密码,可以通过sudo passwd来设置;然后su切换。
825、问open("a.tmp",O_WRONLY|O_CREAT,0777);
创建的文件权限就是0777吗?这段代码还有什么问题?
答、不是,还受目录下的掩码影响。这段代码没有考虑到如果有两个程序同时创建a.tmp文件,会发生错误,因为这是不合理的。
所以必须要在O_CREAT后加上|O_EXCL;这样可以使得创建文件为原子操作。
826、问open(pathname,O_RDONLY|O_WRONLY);其中的|是什么含义?
答、或操作符。
827、问使用open函数时,open(pathname,flags,mode,arg1);
会使用arg1参数吗?
答、不会,最多只用前三个参数。
828、问linux中open函数和creat函数有什么区别?
答、open函数包含了creat函数的功能。
829、问c语言与Qt相比写程序有什么缺点?
答、Qt存在序列化读写文件,而c语言不存在,所以c语言用结构体读写文件比较复杂。
830、文件描述符的本质是?(最准确)
答、内核中存储文件指针的结构体数组的下标。默认时共有1024个结构体。
831、问如何同时打开.cpp或.c文件以及.h文件?
答、:AV;
831、问vim如何切换头文件和.cpp文件或.cp文件?
答、通过:A
832、问如何使用vim生成tag文件?
答、输入vim,进入vim界面,再按键ctrl+p,会退出vim界面,再按enter键进入。退出就能在当前目录找到tags文件。
833、使用vim时怎样进入目录?如何打开目录中的文件
答、ctrl+w+w。跳到目录分屏,再移动光标,按enter键可以打开目录,再按一次enter键会退回,打开目录后移动光标到文件名,再按enter键就能在右边打开文件。
834、vim插件如何使用?
答、按下vim直接可以使用改进的vim,再按ctrl+o;可以通过分屏的方式显示目录(在左边)
835、问什么是文件的上下文?
答、文件的打开模式、文件的位置类型、文件的初始类型等。通过文件标识符可以找到这些信息。
836、问vim中如何分屏?
答、split c。(横向分屏命令)
vsplit c。(竖向分屏命令)
837、linux的vim中如何在两个分屏间切换?
答、ctrl+w+w;先按ctrl键,再按两次w。
838、linux中很多函数和命令是同名的?
答、对。
839、问.表示什么?
答、表示当前目录。
840、问文件的更改和改动的区别?
答、更改是改变内容,改动是改变文件的属性。
841、问什么文件一开机就会启动?
答、/etc/profile.
/etc/fstab(专业的用来挂载配置文件)
842、sudo apt-get install ctags有什么用处?
答、vim插件(vim.tar.gz)在用户home目录解压后输入的启动命令。
843、linux到用户的home目录的命令?
答、cd
844、问fdisk的作用?
答、查看磁盘信息。
845、问硬盘分区的目的?
答、分区是为了隔离,隔离是为了管理。
846、问linux中程序中使用当前目录,采用什么书写方式?
答、./
847、问一个进程打开,0,1,2号文件描述符是什么?
答、不管有没有使用open等打开或读文件函数,0,1,2号文件描述符默认指向标准输入,标准输出,标准错误文件。
848、问printf实际上调用了fwrite函数,fwrite函数实际上调用了write函数,这种说法对不对?
答、对。
849、问缓冲的好处?
答、提高存储效率,
850、问tmp目录任何用户都能写文件?
答、对。
851、word打开文本文件和txt打开文本文件有什么不同点?
答、一个是通过文件映射,另一个不是,所以前者较快。
852、文件映射的好处?文件映射的函数是什么?
答、效率非常高。mmap/munmap;
853、问打开的文件能不能立刻被删除?
答、不能,当文件关闭了才会真正删除,期间只是不让用户看到文件而已。
854、能不能用剪切功能实现复制?
答、可以,剪切后再撤销就能实现复制。
855、什么因素决定了printf函数打印的对象。
答、printf函数(高级语言程序)是向1号文件描述符打印文件,默认1号文件描述符
指向的文件结构体内的文件指针是指向标准输出的。但是如果通过dup操作改变
1号文件描述符内的指针指向,那么printf函数会指向非标准输出文件。
所以决定因素是文件描述符指向的结构体内的文件指针指向。
856、问文件描述符的索引表在哪?存放了什么?
答、在内核,文件描述符。若用户进程有打开文件操作,会拿到文件描述符。
857、进程中有很多文件描述符?
答、说法正确。
858、问文件描述符的类型?
答、整型,范围0-1023。
859、问能不能将很多经常使用的头文件放在同一个head.h头文件中,
这样很明显可以提高编写代码的效率?
答、可以。
860、问如何查看磁盘的文件系统类型?
答、单击右键文件中磁盘,并选择属性,即可查阅出类型。
861、问linux系统接口的函数查找命令?
答、man 2 而不是man。
862、问.tar文件解包命令?.tar.gz文件解压缩命令?
答、tar -xvf a.tar
tar -xzvf a.tar.gz;
863、问read和write函数中什么时候最适合用O_APPEND?
答、写系统日志,能保证不覆盖。
864、问系统调用会不会影响程序执行时间?
答、会。
866、问什么是用户CPU,什么是内核CPU?
答、通俗的说法,指处理用户事务时CPU花费时间和执行内核中程序的CPU花费时间,
867、问int fd_dst=open(dstfilename,o_WRONLY|O_CREAT);
int fd_dst=open(dstfilename,o_WRONLY|O_CREAT,0777);
int fd_dst=open(dstfilename,o_WRONLY|O_CREAT|O_EXCL,0777);
哪种写法正确?
答、第三种。
868、问用lseek函数读写文件,如何知道文件的大小?
答、通过lseek的返回值(设置适当的参数)。
869、问fwrite函数和write函数有什么主要区别?
答、fwrite会在用户空间开辟缓存空间,而且在内核空间也会开辟;
write不会在用户空间开辟,但是会在内核空间开辟。
870、问.gz文件如何解压缩?
答、gzip -d 加文件名
871、linux上命令按tab键有什么作用?
答、可以查找要补齐的文件,特别是apt-get 下载文件时也能通过按tab键查看要下载的文件,
但是必须要先update下载要下载的文件的索引。
872、问系统内核是什么?系统调用是什么?
答、系统内核是存储了所有系统调用的空间,还有缓冲,系统调用主要是
操作系统操作系统的硬件资源的程序。
873、问realpath的作用?
答、可以将相对路径转换为绝对路径。
874、当前目录是指什么?
答、当前的shell程序所在的目录(shell是用来解析命令的程序)。
875、touch作用?
答、创建文件。
876、home目录如何表示?
答、~;home目录是用户账户所在的目录。
877、linux中路径是以什么开始?
答、根目录/
878、从信息角度,说出计算机的作用?
答、保存信息,操作信息,传输信息,展现信息。
879、shell进程作用?
答、提供用户接口,供用户输入命令,shell会解析命令,操作计算机。
880、login进程作用?
答、提供用户接口,供用户登录。执行/etc/.bashrc脚本
881、init程序的作用?
答、linux系统的第一个程序。执行/etc/profile脚本
882、kernel的作用?
答、初始化硬盘。
883、问boot的作用?
答、选择启动的操作系统。
884、问bios的作用是什么?
答、初始化主板,初始化硬盘。
885、什么是linux操作系统发行版?
答、都使用linux内核,但是操作系统软件不同。这样的操作系统叫做发行版。
886、接口。是什么?
答、一种由它方实现自己需求功能的机制
997、应用程序能访问硬件吗?
答、不能,必须通过操作系统访问。
998、ubuntu与linux的关系?
答、是linux的发行版。
999、linux操作系统的功能?
答、主要是数据处理。
1000、计算机系统包括哪两个方面?
答、软件和硬件。
1、问手机格式化以后的文件能够恢复吗?删除以后呢?如何才能将文件删除干净?
答、能,能,只有用大的文件进行覆盖以后才能真正删除原文件。
2、问./a.out < file执行的结果是?
答、将程序运行结果重定向到file。
3、重定向的含义是什么?
答、将文件信息从一处“搬”到另一处。
4、cd -号的作用?
答、回到上次的路径下。
5、如何查看程序的退出值?
答、echo $?
6、映射的含义?
答、一个东西,另一个东西是这个东西的另一种表现形式,对另一个东西操作,
就相当于对这个东西操作。当然可以根据实际情况拓展功能。例如数据库的
外模式(视图)是模式的映射。就像函数的值域是由定义域决定一样,不过
函数的映射是值域与定义域之间的关系,而这里的映射是一种机制。
7、vs的来源是gun的gdb,只是用图形化作了封装而已?
答、是。
8、问linux上如何反撤销?
答、ctrl+r。
9、问如何改变linux控制台黑窗口的背景?
答、 echo -e "\033[44;37;5m ME \033[0m COOL
-----------------------------------------------------------------------------
vim命令
:e filename Open filename for edition
:w Save file
:q Exit Vim
:q! Quit without saving
:x Write file (if changes has been made) and exit
:sav filename Saves file as filename
. Repeats the last change made in normal mode
5. Repeats 5 times the last change made in normal mode
在文件中移动
k or Up Arrow move the cursor up one line
j or Down Arrow move the cursor down one line
e move the cursor to the end of the word
b move the cursor to the begining of the word
0 move the cursor to the begining of the line
G move the cursor to the end of the line
gg move the cursor to the begining of the file
L move the cursor to the end of the file
:59 move cursor to line 59. Replace 59 by the desired line number.
20| move cursor to column 20.
% Move cursor to matching parenthesis
[[ Jump to function start
[{ Jump to block start
剪切、复制和粘贴
117yy,从光标处复制了117行
在命令提示符下输入:56,61y
y Copy the selected text to clipboard
p Paste clipboard contents
dd Cut current line
yy Copy current line
y$ Copy to end of line
D Cut to end of line
搜索
/word Search word from top to bottom
?word Search word from bottom to top
* Search the word under cursor
/\cstring Search STRING or string, case insensitive
/jo[ha]n Search john or joan
/\< the Search the, theatre or then
/the\> Search the or breathe
/\< the\> Search the
/\< ¦.\> Search all words of 4 letters
/\/ Search fred but not alfred or frederick
/fred\|joe Search fred or joe
/\<\d\d\d\d\> Search exactly 4 digits
/^\n\{3} Find 3 empty lines
:bufdo /searchstr/ Search in all open files
bufdo %s/something/somethingelse/g Search something in all the open buffers and replace it with somethingelse
替换
:%s/old/new/g Replace all occurences of old by new in file
:%s/onward/forward/gi Replace onward by forward, case unsensitive
:%s/old/new/gc Replace all occurences with confirmation
:2,35s/old/new/g Replace all occurences between lines 2 and 35
:5,$s/old/new/g Replace all occurences from line 5 to EOF
:%s/^/hello/g Replace the begining of each line by hello
:%s/$/Harry/g Replace the end of each line by Harry
:%s/onward/forward/gi Replace onward by forward, case unsensitive
:%s/ *$//g Delete all white spaces
:g/string/d Delete all lines containing string
:v/string/d Delete all lines containing which didn’t contain string
:s/Bill/Steve/ Replace the first occurence of Bill by Steve in current line
:s/Bill/Steve/g Replace Bill by Steve in current line
:%s/Bill/Steve/g Replace Bill by Steve in all the file
:%s/^M//g Delete DOS carriage returns (^M)
:%s/\r/\r/g Transform DOS carriage returns in returns
:%s#<[^>]\+>##g Delete HTML tags but keeps text
:%s/^\(.*\)\n\1$/\1/ Delete lines which appears twice
Ctrl+a Increment number under the cursor
Ctrl+x Decrement number under cursor
ggVGg? Change text to Rot13
大小写
Vu Lowercase line
VU Uppercase line
g~~ Invert case
vEU Switch word to uppercase
vE~ Modify word case
ggguG Set all text to lowercase
gggUG Set all text to uppercase
:set ignorecase Ignore case in searches
:set smartcase Ignore case in searches excepted if an uppercase letter is used
:%s/\<./\u&/g Sets first letter of each word to uppercase
:%s/\<./\l&/g Sets first letter of each word to lowercase
:%s/.*/\u& Sets first letter of each line to uppercase
:%s/.*/\l& Sets first letter of each line to lowercase
读写文件
:1,10 w outfile Saves lines 1 to 10 in outfile
:1,10 w >> outfile Appends lines 1 to 10 to outfile
:r infile Insert the content of infile
:23r infile Insert the content of infile under line 23
文件浏览器
:e . Open integrated file explorer
:Sex Split window and open integrated file explorer
:Sex! Same as :Sex but split window vertically
:browse e Graphical file explorer
:ls List buffers
:cd .. Move to parent directory
:args List files
:args *.php Open file list
:grep expression *.php Returns a list of .php files contening expression
gf Open file name under cursor
和 Unix 系统交互
:!pwd Execute the pwd unix command, then returns to Vi
!!pwd Execute the pwd unix command and insert output in file
:sh Temporary returns to Unix
$exit Retourns to Vi
对齐
:%!fmt Align all lines
!}fmt Align all lines at the current position
5!!fmt Align the next 5 lines
Tabs/Windows
:tabnew Creates a new tab
gt Show next tab
:tabfirst Show first tab
:tablast Show last tab
:tabm n(position) Rearrange tabs
:tabdo %s/foo/bar/g Execute a command in all tabs
:tab ball Puts all open files in tabs
:new abc.txt Edit abc.txt in new window
分屏显示
:e filename Edit filename in current window
:split filename Split the window and open filename
ctrl-w up arrow Puts cursor in top window
ctrl-w ctrl-w Puts cursor in next window
ctrl-w_ Maximize current window vertically
ctrl-w| Maximize current window horizontally
ctrl-w= Gives the same size to all windows
10 ctrl-w+ Add 10 lines to current window
:vsplit file Split window vertically
:sview file Same as :split in readonly mode
:hide Close current window
:nly Close all windows, excepted current
:b 2 Open #2 in this window
自动完成
Ctrl+n Ctrl+p (in insert mode) Complete word
Ctrl+x Ctrl+l Complete line
:set dictionary=dict Define dict as a dictionnary
Ctrl+x Ctrl+k Complete with dictionnary
Marks
m {a-z} Marks current position as {a-z}
' {a-z} Move to position {a-z}
'' Move to previous position
缩写
:ab mail mail@provider.org Define mail as abbreviation of mail@provider.org
文本缩进
:set autoindent Turn on auto-indent
:set smartindent Turn on intelligent auto-indent
:set shiftwidth=4 Defines 4 spaces as indent size
ctrl-t, ctrl-d Indent/un-indent in insert mode
>> Indent
<< Un-indent
=% Indent the code between parenthesis
1GVG= Indent the whole file
语法高亮
:syntax on Turn on syntax highlighting
:syntax off Turn off syntax highlighting
:set syntax=perl Force syntax highlighting
--------------------------------------------------------------------------------
10、问vim中如何实现折叠功能?
答、①没有在.vimrc中设置set fdm=marker:
直接打开vim
1 :set fdm=marker 在vim中执行该命令
2 5G 将光标跳转到第5行
3 zf10G 折叠第5行到第10行的代码,vim会在折叠的开始和结束自动添加三个连续的花括号作为标记
4 zR 打开所有折叠
5 zM 关闭所有折叠
6 zE 删除所有的折叠标签
7 退出vim窗口再次打开,执行2-6步。依然可以折叠,但是没有标记了。重新打开后折叠信息会丢失。
②在.vimrc中设置了set fdm=marker:
退出窗口再打开折叠不会消失
2 5G 将光标跳转到第5行
3 zf10G 折叠第5行到第10行的代码,vim会在折叠的开始和结束自动添加三个连续的花括号作为标记
4 zR 打开所有折叠 (zo打开光标下的折叠)
5 zM 关闭所有折叠 (zc关闭光标下的折叠)
6 zE 删除所有的折叠标签
11、问vim中如何选中,再折叠?
答、shift +v后再按zf键(不要同时按下)。
12、如何在vim中注释指定行,取消注释呢?
答、注释:首先进入命令行模式,然后移动光标到要批量注释(插入字符)的起始行,然后按下ctrl+v键
(同时按不同时按时可视行模式),进入visual block模式(不是visual 行形式),然后用j、k选中要批量注释的行,
再按一次大写I,最后输入注释符/或要插入的符号。
取消注释:首先静茹命令行模式,然后移动光标到要批量取消注释(消除字符)的起始行的首列,然后按下ctrl+v键,
进入visual block模式,然后使用l键选中要取消的符号的列,再按k,l键进行调整,选中要取消的行,
再按d键,就可以全部删除。
13、问linux如何删除到文件结尾?
答、dG.
14、linux中为了使用typeid().name(),需要包含什么头文件?
答、#include<typeinfo>
15、问linux更新指令?
答sudo apt-get update
16、问linux制作动态库中-fPIC的作用?
答、g++ one.cpp two.cpp three.cpp -fPIC -shared -o libtest.so
-fPIC的全称是file position independent code。表示编译的代码与位置无关。(自做主)
17、问要使ld.so.config中的配置有效,要满足哪些要求?
答、①、gcc或g++编译时,要添上ld.so.config中自己配置的路径。该路径就是动态库.so的路径。而且ltest库名也要加。
②、在ld.so.config中添加动态库所在的路径。(顺序好像写反了)
18、给出生成多个.cpp文件的动态库的方法,以及使用过程?
答、①、g++ one.cpp two.cpp three.cpp -fPIC -shared -o libtest.so(注意头文件可以是一个也可以是多个。流程都一样);
②、修改ld.so.config文件,在其中添加生成的libtest.so文件所在的路径;ldconfig命令加载该配置文件;
③、编译使用该动态库的代码
g++ main.cpp -o main -I/home/lzxice/dynamiclibmulti1 -ltest -L/home/lzxice/dynamiclibmulti1
注意其中-L与刚刚自己添加的动态库路径是一样的。只有这样才能保证ld.so.config中配置的路径生效。
-ltest也要加。-I也必须添加,是动态库的头文件。也是main.cpp中的头文件位置(主要是为main.cpp设置)。
④、使用main程序。
19、服务器不能有中文?
答、对。特别是不能有中文写的目录。
20、问闭包的由来?
答、在函数内定义的函数,在函数中使用这个函数时,可以访问该函数的局部变量。
如果使用的这个函数就是自身,称为闭包。
int add()
{
int count=0;
int plus()
{
count+=1;
}
return plus();
}
int add()
{
int count=0;
return function(){return count+=1};
}
21、问闭包是什么?
答、子函数可以使用父函数的局部变量,还有父函数的参数。
22、在指定行添加两个字符?
答、 sed -i 's/^.*zz.*/--&/g' testabc.lua
23、问压缩文件的好处?
答、网络传输文件更快,效率高。
24、问gzip命令如何使文件具有最佳的压缩比?
答、gzip -9 -c man.config >hello.gz
25、问如何将某个文件夹下包含某个字符串的文件移动到另一个文件夹?
答、find . -name "*.ai" -exec mv {} /data1/test/test \;
26、declare -i date_dem=`date --date="$date2" + %s`;问哪里有错?
答、应该是+%s。
27、尽可能延后变量定义式的出现。
28、vim突然卡死(阿里云服务器)如何解决?
答、使用vim时,如果你不小心按了 Ctrl + s后,你会发现不能输入任何东西
了,像死掉了一般,其实vim并没有死掉,这时vim只是停止向终端输出而已,
要想退出这种状态,只需按Ctrl + q 即可恢复正常。
29、vpn正向代理,nginx有反向代理?
答、对。
30、vpn的机制?
答·、修改包的来源为其它国家,修改包的去向为其它国家。
31、服务器并发量的多少与内存有关?
答、对。
32、查看占用端口号的进程?
答、sudo lsof -i:80
33、问分布式一般采用什么类型的数据库?
答、nosql。偏向于内存数据库,性能更高。但为了防止数据丢失,也会结合采sql数据库存储。
34、nginx可以搭建email服务器吗?
答、可以。
35、统计目录下所有指定类型文件的行数?
答、wc *.c -l;
36、如何查找某个目录下所有文件包括子文件夹包含指定字符串的所有行。
答、grep "main" . -r --color
37、linux上按时间排序文件?
答、ls -lrt
38、firefox造成linux系统很卡。
39、linux上如何查找某目录下文件名中包含某段字符串的文件个数?
答、find . -name "*gif*" | wc -l
40、linux查看磁盘空间?
答、df -h
41、能不能在线程中开辟线程?
答、可以。
42、问linux socket系统调用listen第二个参数的含义,该系统调用的作用?
答、表示能监听的最大并发量。系统调用监听与服务器完成三次握手的socket,
等待被accept系统提取。listen阶段开始进行tcp的三次握手。
43、进程是如何得知信号要被处理?
答、通过检查PCB中的信号标记。
44、epoll使用了mmap?
答、对。
45、linux如何查看某个进程对应的端口号?
答、netstat -anp | grep "abc";
46、linux打印ps aux 第二列结果?
答、ps aux | grep "phan" | awk '{print $2}';
47、shell命令查看一个程序的系统调用?
答、strace 进程名
48、如何判断一个api是不是系统函数?
答、是否访问内核数据结构;是否访问外部硬件资源。二者有一为系统函数。
49、进程的内核区存储进程pcb?
答、正确。
50、简述ls | wc –l命令的原理?
答、ls和wc是父子进程的关系,ls命令正常会将结果集写出到stdout,但现在会写入管道的写端;wc –l
正常应该从stdin读取数据,但此时会从管道的读端读。
51、问管道的局限性?
答、
管道的局限性:
① 数据不能进程自己写,自己读。
② 管道中数据不可反复读取。一旦读走,管道中不再存在。
③ 采用半双工通信方式,数据只能在单方向上流动。
④ 只能在有公共祖先的进程间使用管道。
52、问管道的优劣?
答、
优点:简单,相比信号,套接字实现进程间通信,简单很多。
缺点:1. 只能单向通信,双向通信需建立两个管道。
2. 只能用于父子、兄弟进程(有共同祖先)间通信。该问题后来使用fifo有名管道解决。
53、问FIFO是什么?
答、命名管道。以区分管道(pipe)。管道(pipe)只能用于“有血缘关系”的进程间。但通过FIFO,
不相关的进程也能交换数据。
54、问什么是存储映射I/O?
答、
存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中
取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件。
这样,就可在不适用read和write函数的情况下,使用地址(指针)完成I/O操作。使用这种方法,首先
应通知内核,将一个指定文件映射到存储区域中。这个映射工作可以通过mmap函数来实现。
55、问mmap函数使用要注意什么?作用是什么?
答、调用munmap,作用是将进程的某段内存与某块磁盘区域相映射。
56、问如何理解信号是软件层面的中断?
答、通过在进程的pcb中设置与信号相关的标志,进程执行该标志对应的中断处理程序。
57、什么叫信号递达到进程?
答、递送并且到达进程,该进程检查pcb中对应的信号标记后。
58、问select和epoll的区别?
答、select有如下缺点:
1)每次调用 select(),都需要把 fd 集合从用户态拷贝到内核态,这个开销在 fd 很多时会很大,
同时每次调用 select() 都需要在内核遍历传递进来的所有 fd,这个开销在 fd 很多时也很大。
2)单个进程能够监视的文件描述符的数量存在最大限制,在 Linux 上一般为 1024,可以通过修改
宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。
解决一个程序只能有一个阻塞点的问题。
epoll:
1)监视的描述符数量不受限制,它所支持的 FD 上限是最大可以打开文件的数目,这个数字一般远大于 2048,举个例子,
在 1GB 内存的机器上大约是 10 万左右,具体数目可以 cat /proc/sys/fs/file-max 察看,一般来说这个数目和系统内存关系很大。
select() 的最大缺点就是进程打开的 fd 是有数量限制的。这对于连接数量比较大的服务器来说根本不能满足。虽然也可以选择多进程
的解决方案( Apache 就是这样实现的),不过虽然 Linux 上面创建进程的代价比较小,但仍旧是不可忽视的,加上进程间数据同步远比
不上线程间同步的高效,所以也不是一种完美的方案。
2)I/O 的效率不会随着监视 fd 的数量的增长而下降。select(),poll() 实现需要自己不断轮询所有 fd 集合,直到设备就绪,
期间可能要睡眠和唤醒多次交替。而 epoll 其实也需要调用 epoll_wait() 不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,
但是它是设备就绪时,调用回调函数,把就绪 fd 放入就绪链表中,并唤醒在 epoll_wait() 中进入睡眠的进程。虽然都要睡眠和交替,
但是 select() 和 poll() 在“醒着”的时候要遍历整个 fd 集合,而 epoll 在“醒着”的时候只要判断一下就绪链表是否为空就行了,
这节省了大量的 CPU 时间。这就是回调机制带来的性能提升。
3)select(),poll() 每次调用都要把 fd 集合从用户态往内核态拷贝一次,而 epoll 只要一次拷贝,这也能节省不少的开销。
59、问i/o多路复用解决的是什么问题?
答、解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用。
60、给出select使用的api?
答、fd_set rfds;
FD_ZERO(&rfds);
FD_SET(0, &rfds);
FD_SET(fd, &rfds);
select(FD_SETSIZE, &rfds, NULL, NULL, NULL);
if( FD_ISSET(0, &rfds) )
if( FD_ISSET(fd, &rfds) )
61、给出epoll使用的api?
答、int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
62、epoll和select的对比?
答、
select缺点:
最大并发数限制:使用32个整数的32位,即32*32=1024来标识fd,虽然可修改,但是有以下第二点的瓶颈;
效率低:每次都会线性扫描整个fd_set,集合越大速度越慢;
内核/用户空间内存拷贝问题。
epoll的提升:
本身没有最大并发连接的限制,仅受系统中进程能打开的最大文件数目限制;
效率提升:只有活跃的socket才会主动的去调用callback函数;
省去不必要的内存拷贝:epoll通过内核与用户空间mmap同一块内存实现。
当然,以上的优缺点仅仅是特定场景下的情况:高并发,且任一时间只有少数socket是活跃的。
如果在并发量低,socket都比较活跃的情况下,select就不见得比epoll慢了(就像我们常常说快排比
插入排序快,但是在特定情况下这并不成立)。
63、问epoll_create,函数调用时,内核做了哪些事情?
答、内核帮我们在epoll文件系统里建了个file结点;
在内核cache里建了个红黑树用于存储以后epoll_ctl传来的socket;
建立一个list链表,用于存储准备就绪的事件。
64、问epoll_ctl时,程序做了哪些事情?
答、把socket放到epoll文件系统里file对象对应的红黑树上;
给内核中断处理程序注册一个回调函数,告诉内核,如果这个句柄的中断到了,
就把它放到准备就绪list链表里。
65、问epoll_wait时,程序做了哪些事情?
答、
观察list链表里有没有数据。有数据就返回,没有数据就sleep,等到timeout时间到
后即使链表没数据也返回。而且,通常情况下即使我们要监控百万计的句柄,大多一次
也只返回很少量的准备就绪句柄而已,所以,epoll_wait仅需要从内核态copy少量的句
柄到用户态而已。
66、问调用select函数时,发生了什么事情?注意select之前已经将所有的要监听的文件描述符放入了fd中。
答、
从用户空间拷贝fd_set到内核空间;
注册回调函数__pollwait;
遍历所有fd,对全部指定设备做一次poll(这里的poll是一个文件操作,它有两个参数,一个是文件fd本身,
一个是当设备尚未就绪时调用的回调函数__pollwait,这个函数把设备自己特有的等待队列传给内核,让内
核把当前的进程挂载到其中);
当设备就绪时,设备就会唤醒在自己特有等待队列中的【所有】节点,于是当前进程就获取到了完成的信号。
poll文件操作返回的是一组标准的掩码,其中的各个位指示当前的不同的就绪状态(全0为没有任何事件触发),
根据mask可对fd_set赋值;
如果所有设备返回的掩码都没有显示任何的事件触发,就去掉回调函数的函数指针,进入有限时的睡眠状态,
再恢复和不断做poll,再作有限时的睡眠,直到其中一个设备有事件触发为止。
只要有事件触发,系统调用返回,将fd_set从内核空间拷贝到用户空间,回到用户态,用户就可以对相
关的fd作进一步的读或者写操作了。
67、问linux上如何解压bz文件?
答、bunzip2 file.bz;
68、问linux上date命令的作用?
答、输出系统时间。
69、问linux上如何统计程序的运行时间?
答、time ./hello.
70、问gcc -o1、-o2、-o3的作用?
答、优化编译或优化代码执行速度。
71、linux上apt-get 安装的lib的位置?
答、/usr/local/lib/;/usr/lib;
72、ctags为系统目录生成tags?
答、ctags -I __THROW --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --fields=+S -R -f ~/.vim/systags /usr/include /usr/local/include
73、linux根据文件名快速查找包含某个字符的文件?
答、locate iostream.
答、
2、两个进程同时访问一个全局变量是不安全的?
答、对。
3、问应用线程时一般都要结合消息队列来使用?
答、对。
4、问什么是线程池?应用范围有哪些?
答、线程池就是多个线程处理同一个事情。
1)、需要大量的线程来完成任务,且完成任务的时间比较短。 WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。 但对于长时间的任务,比如一个Telnet连接请求,线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。
2)、对性能要求苛刻的应用,比如要求服务器迅速响应客户请求。
3)、接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。突发性大量客户请求,在没有线程池情况下,将产生大量线程,虽然理论上大部分操作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限,并出现"OutOfMemory"的错误。
5、问在服务器中使用多线程的场景是怎样的?
答、主线程用于接收报文,子线程用来获取报文和处理报文。
6、问在客户端中使用多线程的场景是怎样的?
答、主线程保存任务,子线程获取任务。
7、问pthread_join会不会阻塞调用它的线程?
答、会。
8、问pthread_join回收线程的本质是什么?
答、回收线程的PCB。
9、问在线程里调用exit会造成什么后果?
答、退出整个进程。
10、问获得线程ID号的函数是什么?
答、pthread_self。
11、问被创建的新线程是什么?
答、新的指令执行序列。
12、问线程有没有PCB?
答、有,而且和进程的PCB结构完全一样。PCB中的虚拟地址空间和创建它的进程的虚拟地址空间完全保持一致。
13、问设置屏蔽集合的函数?
答、sigprocmask。
14、问给出父进程调用wait来回收子进程的PCB时,不被阻塞的机制?
答、一般子进程退出和状态变化时,都会发射SIGCCHLD信号,可以通过设置对该信号的信号处理函数来调用wait函数回收子进程的尸体。
15、问如何查看能够被设置打断后重启的系统调用?
答、man 7 signal.
16、问如果在执行系统调用函数过程中,被信号打断了,等信号处理后,这个系统调用函数能执行吗?有补救的方法吗?
答、不能,默认执行失败,错误码是EINTR。有些系统调用函数可以设置打断后重启机制,这样等信号处理完成后,该函数不会被打断。继续重新执行。如果signal函数注册信号处理函数,默认被中断的系统调用是自动重启的。
17、问什么是不可靠信号?
答、信号值小于32的都是不可靠信号。它们都有一个共同特点的,当接收到一个信号,来不及处理,又收到同一个信号,那么这两个信号合并成一个信号。
18、问什么时候内核会在进程的PCB中记录信号?
答、进程无法继续了。例如除零操作、非法访问内存地址;
19、问信号的作用?
答、内核和进程通信的方式。
20、简述信号的处理过程?
答、如果内核希望打断进程的顺序执行,那么内核会在进程的PCB中记录信号,当这个进程被分配到CPU,进入执行状态,首先会检查是否有信号,如果有信号,那么进程会先尝试执行信号处理函数。
21、问进程组长退出以后,进程组的其他进程的组号有没有变化?
答、没有。
22、问session领导退出会造成什么后果?
答、这个session内所有进程都退出。
23、问僵尸进程什么时候会被清理?
答、①、父进程调用wait函数回收;②、父进程退回。
24、问僵尸进程会造成的唯一后果?
答、内存泄漏。
25、进程只能访问虚拟地址?
答、对。
26、给出ps aux后的进程状态集合
答、
进程状态查阅表
PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers
(header "STAT" or "S") will display to describe the state of a process.
D Uninterruptible sleep (usually IO)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
T Stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z Defunct ("zombie") process, terminated but not reaped by its parent.
For BSD formats and when the stat keyword is used, additional characters may
be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group
27、问进程的状态有哪些?
答、5个、0表示可运行状态、1表示中断等待状态、2表示不可中断状态、3表示僵死状态、4进程已经停止、5交换状态。
28、问如何获得进程的环境变量?
答、setenv、getenv、unsetenv
29、问环境变量的内容是什么?
答、进程运行时的环境信息。
30、问unlink的作用?
答、减少inode结点的链接个数。
31、问什么是虚拟文件系统VFS?
答、在用open打开文件时,内核会为打开文件创建文件描述符指针(进程PCB)、文件表、vnode表。
32、问从磁盘系统结构,可以将磁盘分成几个部分?
答、inode、目录项、数据项。
33、问目录的目录项结构是怎样的?inodenumber指向什么地方?
答、inodenumber 文件名;
inodenumber指向一个inode结点。该inode结点在磁盘上。
35、问硬链接的作用???
答、在硬链接文件所在的目录的数据快中添加指向被链接文件inode的inodenumber ,但是该inodenumber对应的文件名不再是被链接的文件名,而是新建的硬链接文件的文件名字。
36、问一般新建目录和文件,会不会被分配inode?
答、会。
37、文件锁的粒度是什么?记录锁的粒度是什么?
答、文件锁的粒度是整个文件;记录锁的粒度是部分。
38、问wc file的结果?如何详细取结果中的各数?
答、file文件内的行数、单词数、字符数、文件名;
wc -l取行数;
wc -w取单词数;
wc -c取字符数。
39、问某文件的权限为: -rw-r--r--,用数值形式表示该权限,则该八进制数为:_____,该文件类型是__普通文件_____.
答、0644(其中0表示8进制)、普通文件
40、给出判断一个十进制数的二进制的1出现个数的位数的程序?
答、int func(int x)
{
int countx = 0;
while(x)
{
countx++;
x = x&(x-1);
}
return countx;
}
非常重要,很有可能会被面试到。
41、Linux下两个进程可以同时打开同一个文件,这时如下描述错误的是:———(阿里巴巴笔试题).E。
A. 两个进程中分别产生生成两个独立的fd
B. 两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性
C. 进程可以通过系统调用对文件加锁,从而实现对文件内容的保护
D. 两个进程可以分别读取文件的不同部分而不会相互影响
E. 任何一个进程删除该文件时,另外一个进程会立即出现读写失败
答、E;
42、问创建一个目录文件时,该文件中的.和..对应的inode存放在什么地方?
答、当创建一个目录文件时,系统会为该目录分配一个inode,同时分配一个数据块,inode对应的指针指向就是该数据块,在该数据块中存放了文件.和..的inode;注意就自身而言.和..仍旧是目录。
43、问改变文件所有者执行权限的命令?所有用户的执行权限呢?
答、chmod u+x file1;chmod a+x file1;
44、问文件权限分成四段分别表示什么?
答、文件类型、文件所有者的权限、文件所有组的权限、其它用户的权限。
45、问切换到主目录的命令?
答、cd ~lzx;
46、问
gcc MYTHREAD.c -o mythread
如何MYTHREAD.c中有线程,这样编译对吗?
答、错误,因为没有-lpthread。
47、问.目录和..目录分别指向什么地方?
答、.目录指向本地目录;..目录指向上一个文件目录。
48、问为什么在操作文件时,要把目录.和目录..忽略掉?
答、否则会进入死循环。
49、问统计文件中指定字符串出现的行数的命令?
答、grep -o "in" file | wc -l.
50、问压缩文件命令,文件a.txt?
答、tar -czf mm.tar.gz a.txt.
51、问文件名存放在什么地方?
答、存放在文件所在目录的文件内容部分。
52、mount命令的作用?什么是虚拟文件系统?
答、将分区挂载到虚拟文件系统。虚拟文件系统在内核上,是部分硬盘结构的映像。
53、问硬链接存储在硬盘上吗????
答、没有。
54、问设置目录的stickybit位的命令?
答、chmod o+t。
55、问对目录设置stickybit位,有什么作用?
答、账户只能删除和修改它自己创建的文件,对于其它账户创建的文件,它不能修改和删除。例如公共目录/tmp。
56、问设置SGID位的命令?
答、chmod g+s或
chmod g-s;
57、问设置了目录的SGID位后,有什么效果?
答、在这个目录下创建的文件,拥有者是创建文件的进程的有效账户,而拥有组是该目录的拥有组。
58、问如何设置文件的SUID属性?
答、chmod u+s或者chmod u-s;
59、问格式化磁盘的命令?
答、sudo mkfs.ext4 /dev/sdb1
60、问磁盘分区的命令?
答、sudo fdisk /dev/sdb
61、问显示文件描述符最大值和栈空间的函数?
答、ulimit。
62、问读写配置信息的函数?获得配置信息的函数?
答、sysconf;
getconf;
63、问怎样提高IO效率?
答、通过内核缓存。
64、问fcntl的作用?
答、fcntl可以设置文件描述符属性、文件状态属性、文件描述复制、设置文件锁、设置文件通知。
66、问大规模文件描述符解决多路IO问题时,select效率怎么样?epoll效率怎么样?
答、效率低。epoll效率高。
67、问select和epoll哪个出现早?
答、select;
68、问select函数内部的数据结构?
答、顺序查找。位图。
69、问多路IO造成了什么问题?
答、造成了cpu资源的浪费问题。
70、问
#include"../header.h"
int main()
{
char a=0xff;
//int b=(unsigned int)a;
int b=(unsigned int)(unsigned char)a;
unsigned int c=(unsigned int)a;
printf("a=%d,b=%d,c=%u,d=%d\n",(int)a,b,c,(unsigned char)a);
return 0;
}
输出结果?
答、a=-1,b=255,c=4294967295,d=255。
71、问unsigned int数据类型的输出格式?如果unsigned int 类型的变量任旧用%d输出,会造成什么问题?
答、%u。会发生由unsigned int 类型向int类型的强制类型转换。
72、问
#include"../header.h"
int main()
{
char a=0xff;
int b=(unsigned int)a;
printf("a=%d,b=%d\n",(int)a,b);
return 0;
}
打印结果?说明了什么问题?(linux上执行)
答、a=-1,b=-1;
说明了int 型变量始终将其它变量的高位看成是符号位。unsigned int
73、问IO默认情况是阻塞还是非阻塞?
答、阻塞。
74、问如何让阻塞IO变成非阻塞IO?
答、通过设置O_NONBLOCK标记(类似O_RDONLY)。
75、问什么是非阻塞IO?
答、IO通常是阻塞的,比如读鼠标文件,如果鼠标未产生数据,那么读数据就会阻塞,一直到鼠标移动才能返回。阻塞型IO一直在等。
76、问保存的设置用户ID和保存的设置组ID是如何使用的?
答、①、在一个进程中执行另一个程序时,往往需要用fork函数和exec函数,
exec函数后子进程中所有部分会被exec参数中的程序替代,
但是保存的设置用户ID和保存的设置组ID就是父进程的有效用户ID和有效组ID。
②、当程序要打开一个文件,这个文件中的用户ID位会被设置一个标志,
当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID,
同时保存的设置用户ID存储有效用户ID。组ID同理。
77、问linux上口令和密码的区别?
答、没区别。
78、问pthread_cancel函数常用吗?
答、不常用。
79、问如何终止看似是死循环的线程?
答、通过pthread_cancel函数。
80、
#include"../header.h"
#include<pthread.h>
void *thread_func(void *ptr)
{
#if 0
while(1)
{
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
sleep(1);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
}
#endif
while(1)
{
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
sleep(1);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_testcancel();
}
}
int main()
{
pthread_t tid;
pthread_create(&tid,NULL,thread_func,NULL);
pthread_cancel(tid);
pthread_join(tid,NULL);
printf("exit\n");
}
简述pthread_setcancelstate的函数的意义?
答、首先pthread_cancel函数在主函数中被调用,可以防止该函数后面的程序执行时,线程也执行;
其次如果线程中有循环语句,且里面有退出点(sleep),如果不用pthread_setcancelstate进行保护,
线程就会在sleep位置处退出,如果sleep后面还有我们要执行的函数,
就不能得到执行。所以设置pthread_setccancelstate函数可以让我们需求的程序在退出点后面能够执行。
最后pthread_testcancel()函数则能很好地与pthread_cancel函数相呼应,在我们想要的位置结束线程。
81、
#include"../header.h"
#include<pthread.h>
void *thread_func(void *ptr)
{
while(1)
{
;
// sleep(1);
}
}
int main()
{
pthread_t tid;
pthread_create(&tid,NULL,thread_func,NULL);
pthread_cancel(tid);
pthread_join(tid,NULL);
printf("exit\n");
}
程序执行能退出吗,能够打印出exit吗?如何纠正?说明了什么问题?
答、不能,不能,加上sleep;
说明使用pthread_cancel函数时,如果线程中有循环,要在线程中设置退出点,所谓的退出点就是一些可以
被pthread_cancel执行时能够让线程退出的函数。如果线程没有循环,就能正常退出。是不需要退出点的。
82、问线程的唯一一种非法退出是什么?
答、线程取消:pthread_cancel.
83、问线程越多,强占的cpu越多?
答、对。
84、问使用分离式线程的好处?
答、pthread_detach(tid);线程运行结束后自动回收线程。如果再用pthread_join进行回收是会返回错误的,因为不会成功运行。
85、问消息队列模型必须如何搭配使用?
答、消息队列和锁;消息队列和信号量。
86、在使用条件变量的地方可以使用信号量?
答、对。
87、问哪种线程同步机制和信号量类似?
答、条件变量。
88、问pthread_cond_signal是唤醒一个带有pthread_cond_wait线程还是所有带有pthread_cond_wait线程?怎样唤醒所有的?
答、一个。使用pthread_cond_broadcast可以唤醒所有的。
89、问如果pthread_cond_signal发出信号时带有pthread_cond_wait的进程没有执行pthread_cond_wait而是执行本例程中的其它程序,那么等到要执行pthread_cond_wait时,会不会阻塞?
答、会。前面的信号不会被保存处理。更直接一点地说,pthread_cond_signal只能唤醒正在阻塞的进程。
90、问使用条件变量的代码是怎样的?为什么必须要加锁?
答、pthread_cond_wait(&cond,&mutex);
在本例程内部需要有代码
pthread_mutex_unlock(&mutex);
wait.....
pthread_mutex_lock(&mutex);
91、问设置用户ID位的作用是什么?
答、在执行exec程序时,改变执行后的进程的实际用户ID和有效用户ID。
92、实际上所有程序都是由另一个进程执行的?
答、对。
93、问与进程相关联的用户ID和组ID有哪些?
答、实际用户ID和实际组ID(在登录会话时确定,即人的登录账户)、
有效用户ID和有效组ID以及附加组ID(与文件的所有者ID和组ID其它组ID
相结合进而判断进程是否有对文件的三种操作的权限)、
94、问网络的本质?
答、进程间通信。
95、问信号机制最开始是用来做什么的?
答、杀死进程。
96、问信号机制带来的问题?
答、重入问题、打断阻塞调用、可能不可靠(发五次相同的信号只执行一次因为没有对信号的计数)。
97、一个进程或一个线程只有一个阻塞点?
答、对。
98、在没有多线程之前,怎么解决多路I/O问题?
答、select epoll;
99、问多线程能不能解决多路I/O问题?
答、可以。
100、多路I/O很重要?
答、对。
101、文件的账户属性是什么?是动态的还是静态的?
答、用来判断用户的读写执行权限。是静态的属性;和进程的用户ID配合起来才有意义。
102、问程序的指令存放在哪?
答、不是放在PCB里。
103、问如何判断一个指针变量内存的指针是栈指针还是堆指针?
答、例如
void ptr(void *a)
{
}
int main()
{
}
如果变量a的地址比a内存储的指针小,则a内存储的指针是在栈上;如果大,是在堆上。原因是内存四区模型的栈空间在堆上面。
104、alloca函数的作用?
答、分配栈空间。
105、问brk分配堆内存常用吗?
答、不常用。
106、问文件有哪些属性?
答、文件类型、文件权限、文件ID、文件inode、文件大小;
107、问linux和windows操作系统的线索是什么?
答、linux是从输入和输出设计操作系统;所以文件对linux很重要,所以linux上一切皆文件。
windows是从窗口出发设计操作系统。
108、问为什么fastdb比sqlite要快?
答、sqlite使用的锁锁住了整个文件;但是fastdb只是锁住了文件的部分。
109、问内存数据库是什么?
答、sqlite和fastdb(比sqlite更快);因为磁盘数据库操作效率不高,用内存数据库更快。
110、问什么是量化交易?
答、根据买入和卖出的行情,由软件自动决定选择股票。
111、使用O_APPEND打开文件写的缺点?
答、每次只能从文件末尾写文件。
112、问FD_NOEXEC的作用?
答、设置该属性以后,exec程序完成后,原文件自动关闭。
113、问数据库的本质是什么?
答、文件。
114、问epoll是线程安全的?
答、对。
115、问什么是c100k问题?c1000k问题?
答、参考116.
116、问c10k问题是什么?
答、一台服务器同时支持成千上万个客户端。
117、问epoll的内部实现所用的数据结构是什么?
答、平衡二叉树。确切地说是红黑树。
116、问什么多路I/O复用技术是linux和unix共有的?
答、kqueue。
117、问epoll是linux独有的,其它unix是没有的?
答、对。
118、问为什么以前qq斗地主的一个房间只有固定的人数?
答、因为一个房间就是一个进程,一个进程最多有1024个文件描述符。还有硬件限制。
119、问I/O复用的方法?
答、select、epoll、kqueue、poll、iocp
120、问write会不会阻塞?
答、会,当缓冲区满的时候。
121、问select能容纳多少个文件描述符?通过什么方式办到的?
答、1024个。通过位域描述符。
122、问函数的参数使用const 指针的情况?
答、如果指针变量不是传出,只作为传入参数,加const。这是行业规定。
123、select的作用?
答、从阻塞的I/O的文件描述符中挑选一个文件描述符。
124、select是重点?
答、对。
125、问I/O集合是什么?
答、文件描述符集合。
126、问多路I/O问题出现的原因?
答、一个程序不能有两个地方阻塞,例如一个读键盘另一个读鼠标。
127、问一个程序能不能有两个阻塞的地方?
答、不能。
128、问char型变量的高位是1,转换成整数会出现什么现象?
答、会出现负数。所以要用unsigned强转。
129、问用open打开非设备文件会不会有阻塞现象?打开设备呢?
答、不会。打开设备文件会阻塞。
130、介绍文件、进程、使用者的ID关系?
答、所有ID都分成用户ID和组ID;对于文件,
131、问在shell命令上输入\表示什么?
答、换行继续输入命令。
132、问
{
AutoLock lock(mutex);
a++;
}
用大括号限制加锁的范围有什么好处?
答、增强可读性,避免加锁范围过大力度过大。
133、问枷锁解锁时要注意什么?
答、枷锁和解锁间的程序不同有goto语句;也不能有return等程序终止执行的语句。
134、问为什么报错?
lzx@lzx-vm:~/fileICE/dya3/THICE$ vim THICE8.cpp
lzx@lzx-vm:~/fileICE/dya3/THICE$ gcc THICE8.cpp -lpthread
/tmp/ccbHOuQd.o: In function `std::list<int, std::allocator<int> >::_M_insert(std::_List_iterator<int>, int const&)':
THICE8.cpp:(.text._ZNSt4listIiSaIiEE9_M_insertESt14_List_iteratorIiERKi[_ZNSt4listIiSaIiEE9_M_insertESt14_List_iteratorIiERKi]+0x3a): undefined reference to `std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)'
/tmp/ccbHOuQd.o: In function `std::list<int, std::allocator<int> >::_M_create_node(int const&)':
THICE8.cpp:(.text._ZNSt4listIiSaIiEE14_M_create_nodeERKi[_ZNSt4listIiSaIiEE14_M_create_nodeERKi]+0x70): undefined reference to `__cxa_end_catch'
THICE8.cpp:(.text._ZNSt4listIiSaIiEE14_M_create_nodeERKi[_ZNSt4listIiSaIiEE14_M_create_nodeERKi]+0x83): undefined reference to `__cxa_begin_catch'
THICE8.cpp:(.text._ZNSt4listIiSaIiEE14_M_create_nodeERKi[_ZNSt4listIiSaIiEE14_M_create_nodeERKi]+0x9b): undefined reference to `__cxa_rethrow'
/tmp/ccbHOuQd.o: In function `__gnu_cxx::new_allocator<std::_List_node<int> >::deallocate(std::_List_node<int>*, unsigned long)':
THICE8.cpp:(.text._ZN9__gnu_cxx13new_allocatorISt10_List_nodeIiEE10deallocateEPS2_m[_ZN9__gnu_cxx13new_allocatorISt10_List_nodeIiEE10deallocateEPS2_m]+0x1c): undefined reference to `operator delete(void*)'
/tmp/ccbHOuQd.o: In function `__gnu_cxx::new_allocator<std::_List_node<int> >::allocate(unsigned long, void const*)':
答、本该g++编译,在这里用了gcc。
135、问终端是如何防止后台程序从终端读入数据和输出数据到终端的?
答、由终端驱动程序发送信号控制。
136、问给出使终端驱动产生信号的三个字符命令?
答、中断字符ctrl+c或delet,使终端驱动程序产生SIGINT信号;
退出字符(ctr1+\)产生SIGQUIT;
挂起字符(ctrl+z)产生SIGTSTP;
137、当要挂起前台进程时,通过在终端输入挂起键ctrl+Z,问这个字符会发往哪个对象,该对象又如何处理?
答、键入此字符会使终端驱动程序将信号SIGTSTP送到前台进程组中的所有进程。
138、问终端设备驱动程序是如何知道将终端输入和终端产生的信号送到哪里?
答、内核根据前台进程组来决定信号发往哪里。
139、问前台进程组只能是一个组吗?
答、对。
140、问一个会话能不能没有控制终端?
答、可以。
141、问进程组的组长能不能调用setsid函数?
答、不能。
142、问在shell中是如何将同一进程组ID的进程建立联系的?
答、管道线。
143、问为了设置子进程的进程组,要注意什么?
答、必须同时在父进程程序中编写修改子进程的进程组的代码,及在子进程中自己修改自己进程组ID代码。因为不确定父、子进程运行的先后次序。
144、问为进程设置进程组ID的要求?
答、只能为自己或它的子进程设置进程组ID。如果子进程调用了exec,父进程就不再能改变子进程的进程组ID。
145、问使得进程加入现有的组或者创建一个新进程组的函数?
答、setpgid;
146、问什么是进程组的生存期?
答、从进程组创建开始到最后一个进程离开为止。
147、问组长进程有什么作用?
答、创建一个进程组,创建该组中的进程。
148、问什么是组长进程?
答、进程组ID等于进程ID。
149、问返回调用进程的进程组ID的函数?
答、getpgrp。
150、问如何设置进程组?
答、根据作业,作业相同,进程组最好相同。
151、问哪些终端登录和BSD终端登录类似?
答、Mac OS X终端登录、Linux终端登录、Solaris有两种其中一种与BSD登录方式一样
152、问153到160介绍的用户登录终端的方式属于什么类型的终端登录?
答、BSD终端登录。
153、问登录shell通过login程序创建以后执行什么工作?
答、启动文件(.profile或.bash_profile或.bash_login或.cshrc或.login等);
154、问当shell终止时,init接收的信号类型是什么?
答、SIGCHLD;
155、问login执行哪些工作?
答、①、login得到了用户名(通过getty程序执行exec后得到),
开始调用getpwnam取得相应用户的口令文件登录项;
②、调用getpass以显示提示输出:password:然后读用户键入的口令(密码);
③、调用crypt加密用户键入的口令,并与口令文件中登录项的pw_passwd字段相
比较。④、如果三中用户输入口令错误导致登录失败,login程序会用参数
1调用exit表示登录过程失败。父进程通过login程序结束时的返回值得知子
进程终止状态,于是再调用fork,接着通过exec执行getty程序,重复上述过程。
⑤、对于正确登录的用户,login还要继续执行:将当前工作目录更改为该用户的
起始目录、调用chown改变该终端的所有权,使登录用户成为它的所有者、
将对该终端设备id访问权限改变成该用户的读和写、调用setgid及initgroups设
置进程的组ID、用login所得到的所有信息初始化环境:(起始目录(HOME)、
shell(SHELL)、用户名(USER和LOGNAME)、系统默认路径(PATH))、
改变登录用户的用户ID并调用该用户的登录shell(execl("/bin/sh","-sh",(char *)0))、
打印日期消息文件、检查新邮件以及执行其他一些任务等等。上述是主要功能。
156、问getty进程、login进程的ID是怎样的?
答、相同。
157、问什么时候getty程序调用login程序?
答、getty程序执行后会输出login之类的信息;等待用户键入用户名;当用户键入了用户名后,
getty工作完成。开始调用login程序。
158、问创建终端的程序是什么?
答、getty程序。
159、问管理终端的文件是什么?该文件中记录了什么信息?
答、/etc/ttys。该文件中记录了设备名和传递给getty程序的参数。
160、问什么进程使系统进入多用户状态?
答、init进程。
161、问终端是如何分类的?
答、基于字符的终端、仿真简单的基于字符终端的图形终端、运行窗口系统的图形终端。
162、问不带I/O的函数有哪些?
答、read和write。
163、filter file2 | cat file1 - file3 | lpr表示的含义?
答、filter是命令,执行file2,将结果输出给cat,cat读file1的内容,再读该输出结果的内容,最后读file3的内容。
164、问单独的-表示什么?
答、标准输入。
165、问fcntl函数的功能?
答、复制一个现有的描述符、获得/设置文件描述符标记、获得/设置文件状态标志、获得/设置异步I/O所有权、获得/设置记录锁。
166、只要有进程,就一定有进程对应的功能?
答、对。
167、问dup2是不是原子操作?
答、是。
168、问什么是原子操作?
答、要么不执行、要么执行全部、不会只执行操作的一部分。
169、问什么是v结点表?
答、记录了磁盘文件信息的表。
170、问为了打开磁盘文件,需要在内核建立哪三张表?
答、进程表项(PCB)、文件表、v节点表;其中前两个是与进程对应的,后一个是与磁盘文件对应。
171、虚拟文件系统是什么?
答、v结点的结构。
172、问pcb中有没有文件描述符?
答、有。
173、问在文件中但没有写过的字节会被读成什么?
答、0;
174、问用close关闭文件,会不会释放文件上的记录锁?
答、会。
175、问unix的全称?
答、uniplexed information and computing service。本来是UNICS,后来改为UNIX;
是贝尔实验室、通用电气、麻省理工学院合作的项目。
176、问什么是幻数?
答、在标准例如POSIX中通过STDIN_FILEENO、STUDOUT_FILENO、STDERR_FILENO预定义的数字0、1、2等。
178、问例程时什么?
答、一个执行函数。
179、问什么是FreeBSD?
答、类UNIX操作系统。
180、问什么是UNIX操作系统?
答、它是最古老的操作系统。是分时操作系统,支持多用户和多任务。随着时间的推移,UNIX出现了许多不同的版本。
181、问FreeBSD是什么?
答、UNIX操作系统。
182、问UNXI的三个进程时间值是什么?
答、时钟时间、用户CPU时间、系统CPU时间。
183、问UNIX系统的两种时间值是怎样的?
答、日历时间:自1970年1月1日00:00:00以来的秒数;time_t可以保存这个时间值。
进程时间:也称为CPU时间,用来度量进程使用的中央处理机资源。用时钟滴答计算。
clock_t可以保存这个时间值。
184、问什么是附加组?
答、除了对一个登录名指定一个组ID外,还运行一个用户属于另外的组,而且另外的组数可以达到16个。
185、问用来表示用户ID和组ID的整型数的位数是怎样的?
答、32位。
186、问如何根据用户ID找到登录名?
答、在口令文件中查找。
187、问什么是文件的用户ID和文件的组ID?
答、文件的用户ID表示文件的所有者是谁,即谁可以对该文件具有权限。
文件的组ID表示文件的所属组是哪个,即哪个组可以对该文件具有权限。
188、问组名是什么?
答、与组ID相关,一一对应。组名和组ID之间的关系在文件/etc/group中被建立。
189、问设置组ID的作用是什么?
答、允许同组的各个成员之间共享资源例如文件。
190、问什么是组ID?
答、在口令文件登录项中记录,是一个数值。也是系统根据用户的登录名进行分配的。在口令文件中会为每个用户创建记录项,而被分配到相同的组的用户的记录项具有相同的组ID。
191、问用户ID为0的用户是什么?
答、根root用户或超级用户。(用户名是root)
192、问什么是用户ID?
答、口令文件中登录项里的用户ID,它可以向系统标识各个不同的用户。是在系统中根据用户名创建的,而且用户不能更改。每个用户有一个唯一的用户ID。
193、问errno使用的两条规则是什么?
答、如果没有出错,则其值不会被一个例程清除;
任何一个函数都不会将errno值设置为0.
194、问什么时候查看errno的值?
答、当例如像open函数一样正在执行的例程出错时(返回-1),才检验其值。
195、问open函数出错时返回什么?
答、自身返回-1,但是对于errno变量,返回大约15种不同的errno值。表示文件不存在、权限问题等。
196、问多线程之所以能工作的原理是什么?
答、同一时刻可以执行多条机器指令。
197、问waitpid函数返回的是什么?
答、子进程的终止状态。
198、问execlp函数是如何要求参数的格式的?
答、参数以null而不是以换行符结束。
199、进程控制的主要三个函数是?
答、fork、exec、waitpid;
200、问存储在磁盘上的可执行文件,是怎么被调用到存储器并执行的?
答、通过6个exec函数中的一个由内核将程序读入存储器。并执行。
201、问标准I/O是什么?
答、带缓冲的使用I/O函数的接口。不需要担心缓冲区的大小。
202、问当一个新程序打开时,如果没有做任何处理,shell为其打开的文件描述符链接到什么地方?
答、终端。????
203、问当运行一个新程序时,所有的shell都会为其打开三个文件描述符:标准输入、标准输出、标准出错
这句话对不对?
答、对。
204、问文件描述符是怎么产生的?
答、内核打开一个已有文件或创建一个新文件时,返回的。
205、问口令文件里有什么?
答、登录名、加密口令、数组用户ID、数组组ID、注释字段、起始目录、shell程序。
206、问linux上的口令文件是什么?
答、/etc/passwd
207、问为什么要使用opendir、readdir、即closedir对目录进行处理?
答、因为不同的unix系统目录项的实际格式是不一样的。
208、问文件系统根的名字/是不是一个文件名?
答、不是,是特殊的绝对路径名。表示根目录。
209、问linux中用斜线将文件名组合在一起称为什么?
答、路径名。
210、问shell如何分类?
答、终端(交互式shell)、文件(shell脚本)
211、问shell是什么?
答、命令行解释器,读取用户输入,然后执行命令。
212、问广义的操作系统是什么?
答、内核以及一些其他软件。其他软件是系统实用程序、应用软件、shell以及公用函数库。
213、问系统调用是什么?
答、内核的接口。
214、问操作系统是什么?
答、一种软件。
215、内核是什么?
答、一种软件,控制计算机硬件资源,提供程序运行环境。即操作系统软件。
216、问操作系统为应用程序提供的服务有哪些?
答、执行新程序、打开文件、读文件、分配存储区、获得当前时间。
217、问操作系统的作用?
答、为应用程序提供服务。
218、问条件变量的本质?
答、线程的一种同步机制。
219、需不需要为锁的建立分配内存?
答、需要。
220、问读写锁又被称为什么?
答、共享-独占锁。
221、问锁机制的描述?
答、某个线程占有锁,就能对某个资源进行访问。
222、问什么情况下需要考虑线程同步问题?
答、当某个线程要修改变量,而其它线程要读取或在修改变量时,就要考虑线程同步问题。
223、问FreeBSD中线程ID是如何规定的?
答、指向线程数据结构的指针。
224、问线程怎样获得自身的线程ID?
答、通过函数pthread_self。
225、问为什么必须使用函数来对两个线程ID进行比较?
答、线程ID可能是用结构体加typedef定义。
226、问处理器只有一个能实现多线程吗?
答、可以,为了保证一个线程阻塞时,另一个还能用。
227、简述在服务器中进程的分配情况?
答、一个线程负责接收报文,另一个负责处理报文。
228、问管道的大小一般是多少?
答、64k。
229、问进程和线程的功能?
答、进程是资源分配的单位,线程是处理机调度的单位。
230、问所有函数外能不能为全局变量初始化变量?
答、可以。
231、问有没有函数可以一次回收多个线程的尸体?
答、没有,必须通过pthread_join(tid,&ret);指定号tid。
232、问正常退出和异常退出的区别?
答、正常退出会返回正常退出的状态码,但是异常退出不会。
233、问主进程中调用了pthread_exit(0);子线程退不退出?
答、不会。
234、问比较两个线程是否是同一个线程的函数?
答、pthread_equal;
235、问linux上多线程的实现有什么特点?
答、比较复杂,windows上比较简单。
236、问windows上多进程通信容易吗?
答、很麻烦
237、问对于新的应用程序,如何选择进程间通信IPC的方式?
答、尽可能避免使用消息队列以及信号量,而应当考虑全双工管道和记录锁。因为后者使用起来简单些。
238、问信号量的一个常用作用?
答、共享资源的同步访问。
239、信号量算不算IPC?
答、严格地说信号量是同步原语。
240、如何保证进程对共享存储访问的同步?
答、信号量或记录锁。
241、问哪种IPC最快?
答、共享存储。
242、为什么信号量比记录锁所花时间更少,还要多使用记录锁?
答、在只需锁一个资源并且不需要使用xsl信号量的所有花哨的功能,宁可使用记录锁。
原因是使用简易,且进程终止时系统会处理任何遗留下来的锁。
243、问信号量和记录锁相比,时间效率怎么样?
答、记录锁比信号量消耗时间更多。
244、问什么是面向对象?
答、通过参考现实世界中对象的方式封装数据,编写程序,解决问题。
245、如何保证操作是原子操作?
答、尽量使得函数在内核中实现。
246、问信号量的本质是什么?
答、计数器。
247、问仅有的两种支持不同主机上各个进程间IPC的类型?
答、套接字、STREAMS.
248、IPC的全称?
答、InterProcessCommunication。
249、什么叫将守护进程实现为单实例?
答、就是在任一时刻只运行该守护进程的一个副本。
250、问大多数的守护进程的父进程是什么?
答、init进程。
251、问如何判断一个进程是不是守护进程?
答、没有一个守护进程具有控制终端,其终端名设置为问号。
252、问init进程是守护进程吗?
答、是。
253、问什么是系统自举?
答、
254、问与作业相关的信息有哪些?
答、会话ID、进程组ID、控制终端以及终端进程组ID。
255、问ps -axj的命令含义?
答、-a表示显示其他用户所拥有的进程的状态;-x显示没有控制终端的进程状态;-j显示与作业有关的信息。
256、问什么是守护进程?
答、也称精灵进程;在系统自举时启动,仅在系统关闭时才终止,没有控制终端,在后台运行。
257、问不可重入函数可以怎样分类?
答、a)、使用了静态数据结构;b)、调用了malloc或free;c)、是标准I/O函数。因为标准I/O库的很多实现都以不可重入方式使用全局数据结构。
258、问在处理信号时,将函数分为可重入函数和不可重入函数的意义?
答、信号会造成中断,但是信号处理完后,又要继续执行函数,中断正在执行的不可重入函数,等信号处理完后该函数不好恢复。所以执行会被打断,返回执行错误。
259、问当捕捉到某个信号时,被中断的是内核中执行的系统调用这种说法正确吗?
答、对。
260、问什么是不可靠的信号?
答、信号可能会丢失。
261、问fork出的子进程实际上复制的是什么?
答、父进程的存储映像。
262、问什么信号不能被忽略?
答、SIGKILL和SIGSTOP,原因是它们向超级用户提供了使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法内存引用或除以0),则进程的运行行为是未定义的。
263、问线程非法退出,能不能join?
答、能。但是第二个参数必须是NULL。
264、问主线程正常退出(没有调用pthread_exit退出),子线程会退出吗?
答、会。
265、问能不能创建一个自生自灭不需要用户自己收拾的线程?
答、可以。
266、问c及c++中函数是几份?
答、一份。
267、问如何解决strtok的不可重入问题,特别是当运行环境是多线程时?
答、使用strtok_r,不能采用文件枷锁的方法,因为效率太低了。
268、问终端有没有窗口?
答、有。
269、问为了建立会话需不需要结构体记录相关信息?
答、需要。
270、信号量处理线程间通信最大的特点?
答、信号量的值可以超过一,执行了一个就减一。
271、问pthread_cond_signal会唤醒几个?
答、一个。pthead_cond_broadcast唤醒所有。
272、问pthread_cond_signal先唤醒,然后pthread_cond_wait执行?pthread_cond_wait会造成阻塞吗?
答、不会阻塞,
273、问usleep(100*1000)表示什么?
答、睡眠100毫秒。
274、所有锁的使用都会造成性能下降?
答、对。
275、问如何减少因为锁造成的效率低的问题?
答、减小加锁的力度。
276、问锁除了会造成死锁现象,还可能造成什么?
答、效率低的问题。
277、问
class s1
{
public:
s1(int &a)
{
m=a;
}
public:
int m;
}
有没有问题?
答、有,因为是引用,所以构造函数必须使用参数化列表。??测试能通过
class s1
{
public:
s1(int &a):m(a)
{
}
public:
int m;
}
278、问如何解决忘了解锁造成的死锁问题?
答、利用构造函数和析构函数进行锁机制的构建。这种锁称为自动锁。
279、问循环锁的特点?
答、重复加锁不会死锁。但是解决不了完了解锁造成的死锁现象。
280、问goto 程序的使用,有没有可能造成死锁?
答、很有可能。
281、问忘了解锁会造成什么后果?
答、死锁。
282、问对同一个要处理的程序加了两次锁会怎样?
答、死锁。
283、程序不能靠运气活着?
答、对。
284、问线程的使用场景是怎样的?
答、比较复杂的多任务场景。
285、问线程能共享进程的栈空间吗?
答、不能,没有线程的进程不能相互访问的,引入线程概念后也不能。
286、线程共享进程的资源?
答、对。
287、问线程有父子关系吗?能不能相互调用pthread_join回收?
答、没有,能。
288、问pthread_join是不是阻塞函数?
答、是。
289、问子线程运行结束要不要被收尸?
答、主线程通过pthread_join函数收尸。
290、问多线程中,如何正常退出程序?
答、最后一个线程例程结束,或最后一个线程例程调用pthread_exit退出。
291、问在例程中执行exit退出发生什么?如何正确退出线程?若在主线程调用pthread_exit会发生什么?
答、整个程序退出、pthread_exit、主线程会结束。
292、问linux上有没有微妙睡眠函数?
答、有、usleep();
293、问什么是线程的例程?
答、执行线程的函数。
294、问什么是函数的上下文?
答、函数运行的线程。
295、相对于操作系统来说,main函数就是普通函数?
答、对。
296、在windows上用线程好还是进程好?
答、线程,因为线程在最开始就被设计到windows。
297、在linux上用线程好还是进程好?
答、进程。线程本身不是linux上的,是后来补丁的。
298、对有子进程和父进程的程序中,要考虑它们的执行顺序对程序运行结果的影响?
答、对。
299、问会话一定要有终端吗?
答、不是。
300、问前台进程组是什么的属性?
答、终端的属性,不是进程的。
301、问ps命令的父进程是什么?
答、shell。
302、问文件结束符是什么?
答、ctrl+D;
303、一个进程组往往是为了完成一个作业设定的?
答、对。
304、问保证程序能读写控制终端的方法是什么?
答、打开文件/dev/tty。
305、问什么是退出键?
答、ctrl+\;
306、问什么是中断键?
答、ctrl+c;或delete;
307、问会话的本质?
答、一个或多个进程组的集合。
308、问进程间通信能不能用mutex枷锁?(通信实体是共享内存,但是共享内存中设置了锁)
答、可以,但是太麻烦。
309、问给文件加锁的函数?
答、flock、fcntl;
310、问
int main()
{
// int fd=open("share_file",O_RDWR);
int fd=shm_open("/share_file",O_RDWR|O_CREAT|O_EXCL,0777);
if(fd<0)
{
fd=shm_open("/share_file",O_RDWR);
}
void *ptr=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0)
strcpy((char *)ptr,"write by To8");
printf("write\n");
getchar();
close(fd);
shm_unlink("/share_file");
munmap(ptr,4096);
return 0;
}
有什么问题?
答、share_file内存文件大小没有设置。所以进程间通信通过mmap不能成功。
311、问int fd=shm_open("/share_file",O_RDWR);
怎样关闭?
答、close(fd);
shm_unlink("/share_file");两步缺一不可。
312、问int fd=shm_open("share_file",O_RDWR);
有什么问题?
答、必须在share_file前加上/。
313、问shm_open打开的是什么?
答、一块内存。在使用mmap进行内存间通信时使用。用来代替将信息存放到磁盘上。
314、问进程间通信时将通信信息写到硬盘上有什么缺点?
答、内存和硬盘间需要交换数据,所以效率较低。
315、问使用mmap进行没有血缘关系的进程间通信时,映射文件的创建方式?
答、命令行:dd of=share_file if=/dev/zero bs=4096 count=1
316、问mmap既可以在有血缘关系的进程之间进行通信,也可以在没血缘关系的进程之间进行通信?
答、对。
317、问使用mmap进行进程间通信,可以查阅什么文档?
答、shm_overview;
318、问有没有类似管道的双工通信?
答、socketpair;
319、问对于命名管道,如果用open打开,权限是O_RDWR后,open函数是不阻塞的?
答、对。
320、介绍命名管道的机制以及特点?
答、命名管道是通过mkfifo显示创建一个管道文件;在两个.c中一个用open打开后读文件;另一个用open打开后写文件。
321、mkfifo a.fifo;
在.c文件中
int fd=open("a.fifo",O_RDWR);
这样写有什么问题?
答、a.fifo是命名管道,但是管道不能同时写和读,所以O_RDWR的写法是错误的。
322、问匿名管道和命名管道的区别?
答、与匿名相比,它可以用于非亲缘关系的进程。
323、问grep inet |grep -v inet6?中-v inet6的含义?
答、在grep inet的结果中进一步搜索不是inet6的数据。-v是起过滤作用。
324、问linux的shell管道命令|是用来做什么的?
答、管道前面的命令的执行结果如果是输出的话,会作为管道后面的命令的输入数据。
325、问为什么read读管道时会发生阻塞现象?
答、等待另外一端写数据。
326、问管道中没有数据,读管道会发生什么?
答、EOF错误。
327、问进程间能够进行通信的基础是什么?
答、每个进程都共享同一个内核。
328、问管道如何创建?
答、先用数组记录两个文件描述符例如int fd[2];再用pipe(fd)将两个我呢间描述符指向同一个文件。默认情况fd[0]用来读数据;fd[1]用来写数据。
329、问进程间通信有多少种?
答、匿名管道、命令管道、socketpair、信号、信号量、锁、文件锁、共享内存、消息队列。
如何分类:小数据量通信(管道、socketpair);大数据量通信(共享内存);进程间同步(socketpair/管道/锁/文件锁/信号量)。
330、问RPC的含义?IPC的含义?
答、RPC不同电脑进程间的通信;
IPC一台电脑中的进程间的通信。
331、问进程终止以后可以做哪两方面的工作?
答、回收存储区、关闭打开的文件。
332、问exit和_exit的区别?
答、_exit不执行标准I/O缓冲的冲洗操作;exit相反。
333、问spawn程序何fork及exec组合程序的区别?
答、它们都是相同的程序。
334、问strlen和sizeof执行时的区别?
答、strlen执行需要函数调用;而sizeof在编译时计算。
335、问如何确定父进程和子进程的执行先后顺序?
答、取决于内核所使用的调度算法。
336、问父进程和子进程有没有共享程序?
答、共享了正文段。
337、问ID为2的进程是什么进程?
答、内核进程,页守护进程,负责支持虚拟存储系统的分页操作。
338、问ID为1的进程是什么进程?
答、init进程,该进程通常读与系统有关的初始文件。并将系统引导到一个状态,
而且该进程绝不会终止。是用户进程,
339、问ID为0的进程是什么进程?
答、调度进程,交换进程,不执行任何磁盘上的程序,也被称为系统进程。是内核的系统进程。
340、为什么要遵守规范?
答、看起来更专业。
341、问守护进程和人有交互吗?
答、没有。不和终端关联。
342、问进程通信如果信息量大最好是什么方式?如果是小量的?
答、共享内存、匿名管道、消息队列、socketpair、
344、问文件锁的作用?
答、实现进程的同步。
345、问mac属于什么系统?
答、unix。
346、问windows有没有session的机制?
答、有。
347、问非血缘关系的进程最好的方法是?
答、mmap结合shm_open
348、问O_EXCL的作用?
答、和O_CREAT连用,如果文件存在就不创建,
349、问analogous?
答、类似。
350、问shm_open的作用?如何删除?
答、建立内存文件,与磁盘无关。
通过shm_unlink函数删除。
351、问使用mmap进行内存间通信的缺点?
答、速度慢。
352、问
dd of=share_file if=/ev/zero bs=4096 count=1;的作用
答、创建映射文件。
353、问父进程和子进程之间通过mmap交换信息通信,要注意什么?
答、父进程必须要后执行,或者谁先写信息,谁先执行。
354、问mmap的文档查看?
答、
355、问如何构建全双工机制?
答、socketpair
356、问open函数什么时候会阻塞?
答、读管道文件。
357、问创建管道文件的shell命令?
答、mkfifo a.fifo;
358、问管道是什么类型的通信?单工?半双工?全双工?
答、只能单方向通信;
可以两个方向通信,但同一个时刻只能有一个方向通信;
可以同时双方通行。
管道是单工通信。
359、问在程序中使用脚本命令?
答、FILE *fp=popen("ps aux","r");
char buf[1024];
while(fgets(buf,sizeof(buf),fp))
{
printf("buf is %s",buf);
}
pclose(fp);
return 0;
注意本程序是个范例,很多脚本语言,例如python等就是根据本原理实现功能。
360、问grep "hello world" a.txt b.txt c.txt的功能?
答、在a.txt、b.txt、c.txt中找hello world字符串。
361、问linux操作系统存放在哪个分区?
答、/dev/sda;
362、问write函数使用要注意什么?
答、1、普通文件:写入
2、管道:write会将数据写入管道,如果管道剩余空间不够,那么write将返回写入的内容长度。例如
char buf[5];但管道剩余空间为3;
int ret=write(fd[1],buf,sizeof(buf));
此时不会阻塞,直接返回3,表示buf有三个字节已经写入。
363、问read函数使用要注意什么?
答、1、普通文件:read不会阻塞,如果文件剩余的内容小于bufsize,直接返回,并将剩余内容读入buf。
如果文件剩余内容大于bufsize,那么直接读bufzie,返回。同时读会影响文件指针,如果已经到了文件末尾,返回0.
2、设备文件:读会阻塞,一直等到有数据来。
3、管道:read会阻塞,原因是等待另外一端写数据。如果write关闭,那么读会将buffer中剩余内容读取之后,最后一次返回0,表示文件末尾。
364、问如果管道读端关闭,管道如何工作?
答、管道写端是不能写的,会发出sigpipe信号。
365、问如果管道写端关闭,管道如何工作?
答、管道内如果有数据,读端会读,但是如果没有数据,读端会报错EOF;
366、问如何判断管道的尺寸?
答、如果管道满了,写时会阻塞;如果管道为空,读时会阻塞。可以是64K。
367、问read函数是阻塞的吗?
答、是。
368、问管道的本质?
答、内核内存中的存储区。
369、问free后的堆空间有没有返回给操作系统?
答、没有。
370、问如何在shell终端上查看程序的正文段、数据段、bss段的信息?
答、size /usr/bin/cc;其中第二个是要查的文件名。
371、问需要存放在程序文件中的段有哪些?
答、正文段、初始化数据段。
372、问未初始化的数据段的内容存放在磁盘上的程序文件中吗?
答、不会。
373、定义在所有函数之外的变量是
374、每个进程在运行时都有一个环境变量?那么它是怎么被表示的?如何在进程中查看环境变量?
答、对,通过字符串指针。exter char **env;通过getenv和putenv。
375、问内核使程序执行的唯一方法?
答、调用一个exec函数。
376、问sigwait函数的作用?
答、阻塞、停下;直到有信号被发出。
377、问如何查看哪些函数可以被signalaction打断哪些不能?如何查看SA_RESTART信息?
答、man 7 signal。
378、问为什么signal不能打断阻塞函数?
答、因为action.sa_flags=SA_RESTART被默认设置。
379、问切换或新开终端的快捷键?
答、ctrl + shift +n/N;
ctrl + alt + tab;稍微等会再左右键选择。
380、问如何获得当前运行的进程的文件描述符?
答、getpid();
381、问什么样的信号处理函数才会造成阻塞函数(getchar())被打断?
答、linux系统调用sigaction信号处理函数。而且信号发出必须从终端。
382、问sigemptyset(&action.sa_mask,SIGUSR1);
函数的作用?
答、屏蔽了SIGUSR1的信号。
383、问为什么有时候需要由程序员自己手动掩盖信号?
答、如果信号处理函数是不可重入的,或者如果不掩盖信息,处理信号后,影响到了其它函数的执行。
最典型的情况是信号处理函数中有全局变量。为的是避免可重入问题。
384、问
void sig_action(int v,siginfo_t*info,void *ptr)
{
printf("int signal\n");
printf("arg is:%d\n",info->si_int);
}
....
struct sigaction action;
//sa_handler和sa_sigaction只能用一个
action.sa_handler=NULL;
action.sa_sigaction=sig_action;
sigemptyset(&action.sa_mask);
// action.sa_flags=SA_SIGINFO;
action.sa_restorer=NULL;
sigaction(SIGINT,&action,NULL);
// kill(getpid(),SIGINT);
union sigval v;
v.sival_int=250;
sigqueue(getpid(),SIGINT,v);
sleep(1);
...
能不能将250传入到sig_action的info->si_int中?
答、不能。因为action.sa_flags没有设置成SA_SIGINFO。
385、问linux和windows操作系统的系统调用相同吗?
答、不同。不同操作系统的系统调用不同。
386、问signal和kill与sigaction及sigqueue的关系?
答、signal和kill是c标准中定义的信号处理函数;但是sigaction和sigqueue是操作系统提供的系统调用,
实际上signal和kill内部调用了sigaction和sigqueue进行实现。但是这是Linux操作系统的系统调用。
387、问sigqueue的作用?
答、和kill函数类似,用来发送信号。
388、问sigaction的作用?
答、和signal函数一样用来注册函数。
389、问在signal.h中sigset_t是什么类型?
答、typedef __sigset_t sigset_t;
在include<bits/sigset.h>中定义
typedef struct
{
unsigned long int __val[_SIGSET_NWORDS];
} __sigset_t;
390、问include<bits/sigset.h>
是存在bits.h和sigset.h吗?
答、错,bits是目录,sigset.h在这个目录中。
391、问strtok和readdir等函数有没有对应的可重入的版本?可重入版本是如何实现的?
答、可以,增加参数。避免不可重入。
392、问SIGINT是什么信号?
答、终端ctrl + c;
393、问
假如一个进程调用了某系统调用导致该进行处于挂起状态,而此时该进程接收到一个信号,那么该系统调用被唤醒。通常该系统调用会返回-1,错误码是EINTR。
这句话是什么含义?
答、就是本来挂起的函数例如getchar()会因为信号而被唤醒执行返回-1;
394、举出一个例子说明一个进程调用了某系统调用导致进行处于挂起状态?
答、getchar();
395、问什么是不可靠信号?
答、信号值小于32的都是不可靠信号,不可靠信号的特点是它们多次被发送但是只会被合并成一个信号。
原因是为进程保存该信号的值只有1位。
396、问信号掩码的作用?
答、屏蔽信号。
397、问398中的字段是什么?如何给字段中相应的位置信号?
答、32位的整数。通过异及移位操作(这也是)。
398、问进程的信号机制是如何实现的?
答、通过在进程的PCB中设置了用来记录信号的字段,如果有相应的信号,相应的字段位被置1,
进程根据这个字段进行信号的发射。
399、信号机制(设置处理函数)能不能实现c语言的异常?
答、可以。
400、问signal(SIGSEGV,SIG_IGN),这种写法有效果吗?
答、没有,因为SIGSEGV是不可忽略的信号。(段错误,访问非法内存发射的信号)
399、问signal(SIGINT,SIG_IGN),这种写法正确吗?
答、可以,一般要求第二个参数是函数,但是SIG_IGN作用是忽略参数1的信号。
400、问终端退出,前台进程组所有进程都会退出?
答、对。
401、问如果没有标准输入(终端),getchar函数返回什么?
答、-1;
402、问如何修改主机名?
答、hostname。
403、使用fopen进行文件读写、fgets、fputs等标准I/O会在用户区新开辟缓冲区?
答、对。
404、问行缓冲的长度一般是多少?
答、1024字节。
405、问如何获得与FILE指针所指的文件的文件描述符?
答、函数fileno(FILE *fp);
406、问如何输出宽字符?
答、格式是%lc或C;同理%ls或S也是输出宽字符。
407、问seek_end会将文件偏移量移动到文件尾部,那么着一定是文件有效数据的尾部吗?
答、不一定,因为磁盘文件都是512B的总数倍。不足是会用0填充的。
408、问fread和fwrite函数适不适合用于跨计算机系统的文件传输?如何解决
答、不适合。一是结构体数据的偏移量以及数据成员的对齐在不同系统或编译器中是不同的。
二是存储多字节整数和浮点数的二进制格式在不同机器上也是不一样的。
解决方法是使用协议。
409、问在使用fgets时要注意什么?
答、考虑最大行长。
410、问使用fopen读写文件,a或a+方式打开,问写文件时有什么特点?
答、只能在尾写(unix高级编程);而且使用a时,只能写不能读。
411、问冲洗缓冲区的命令?
答、fflush。
412、问如何为标准输入输出FILE设置缓冲方式?
答、函数setbuf、setvbuf、
413、问标准输错流有缓冲区吗?
答、没有。
414、问标准I/O的缓冲区分类?
答、全缓冲、行缓冲、不设缓冲区(字符缓冲)。
415、为什么标准I/O要设置缓冲区?
答、为了减少调用read和write函数的次数,进一步减少了内核的系统调用的使用次数。
416、问使用fopen函数有没有创建第四个结构体?
答、有,该结构体中有用于实际I/O的文件描述符、指向用于流缓冲区的指针、
缓冲区的长度、当前缓冲区的字符数以及出错标志等。
417、disposition?
答、安排、处置。
418、问signal函数实际上调用了sigaction函数实现?会打断阻塞函数吗?
答、对。不会,因为默认了sa_flags被设置为SA_RESTART;
419、问如何避免阻塞函数被打断后,还能重新运行?
答、设置action.sa_flags=SA_RESTART;
420、问goto语句,goto和
end之间能不能定义变量?
答、不能。
421、使用sigaction函数处理信号,会对阻塞函数有什么影响?
答、例如阻塞函数getchar不会执行,被跳过(打断),执行后续函数。
422、问sigaction和sigqueue函数是用来做什么?
答、处理信号和发射信号。
423、问struct sigaction结构体中,sa_handler和sa_sigaction能不能同时定义?
答、不能,这两个函数指针只能使用一个,另一个会赋值NULL。
424、问wait的非阻塞函数是什么?
答、waitpid;
425、问什么是阻塞函数?
答、执行本函数时,等待资源,不占用cpu,造成程序卡住了。
426、问信号有没有被子进程继承?信号处理函数呢?
答、没有,继承了。
427、问如何给组发kill信号?
答、kill -kill -2;
如果不加-,就是给进程;加了-就是给组。
428、问strtok和readdir是不可重入的,有没有对应的可重入的版本?
答、有。strtok_r、readdir_r;
429、问不可靠信号能不能被处理多次?可靠信号呢?
答、不能,能。
430、问进程信号记录存在,如何避免信号执行?
答、采用掩码技术,mask;
431、给出处理进程信号的函数?
答、sigemptyset;清空信号
sigfillset;置全部信号;
sigaddset;添加特定信号
sigismember;查看信号是否存在
432、问SIGSEGV信号能不能被屏蔽?
答、不能。但是可以被处理。
433、问除零,会出现什么信号?
答、SIGFPE;
434、问linux中用命令kill显示出所有信号,这些都有效吗?
答、不是,共出现64个但是不是每个都有效。
435、问空目录就完全没有任何文件吗?
答、还有隐藏文件.和..
436、windows如何进程磁盘分区?
答、
437、linux打印当天日期的命令?
答、date。
438、问如何改变文件的访问和修改时间?
答、utime函数。
439、问如何按照文件的时间进行排序显示文件?
答、ls -l或ls -t:文件的修改时间;
ls -u按访问时间;
ls -c按更改状态时间。
440、文件inode结点(i结点)中存放了哪些信息?inode结点和文件内容是分开存放的吗?
答、文件的访问权限、用户ID、链接数;对。
441、符号链接的一个重要作用?
答、将一个文件或整个目录结构移动到系统中的另一个位置。
442、对于目录,只有超级用户才能创建指向目录的硬链接?
答、对。
443、问目录中存放的是什么?
答、文件名和i结点编号。
444、问拷贝一个有空洞的文件,空洞也会被拷贝吗?
答、不会,原来有空洞的地方都会被填满,而且根据所占磁盘块数计算的字节数会比ls -l计算的要多,
这是文件系统中还要使用若干块存放四级数据块的指针的结果。
445、问在不打开文件的情况下,如何知道文件有没有空洞?
答、通过du -s core查看文件所占磁盘块数,一般是以1024或512字节为单位,并与ls -l core显示出的字节数进行比较。
注意core是文件名。
446、问进程拥有此文件是如何定义的?
答、有效用户ID等于该文件的用户ID。
447、问如何对指定的已打开的文件改变权限?
答、fchmod函数。
448、问shell的文件模式屏蔽字如何更改?如何按符号形式打印出来?
答、umask 027;
umash -S;
449、问设置屏蔽字的函数?屏蔽字的工作原理
答、umask;
任何文件mode中与屏蔽字中为1对应的位都会被关闭。
450、即使进程的权限是超级用户,也可以通过什么方法验证实际用户对文件的访问权限?
答、通过access函数。
451、问新文件的用户ID如何确定?组ID如何确定?
答、用户ID和进程的有效用户ID相同;组ID可以是进程的有效组ID也能是所在目录的组ID。
452、问有效用户ID和有效组ID是什么的性质?文件的所有者信息时什么的性质?
答、前者是进程的;后者是文件的。
453、隐藏文件是怎么办到的?
答、通过设置权限。
454、问对目录的读权限和执行权限该如何理解?
答、目录的读权限允许我们获得在该目录中所有文件名的列表;而目录的执行权限允许我们通过这条路径访问到执行的文件。例如/usr/include.c;通过路径搜索时,
需要通过目录usr找到include.c;所以又称为执行权限位为搜索位。
455、问在交互式shell(终端)上输入命令如何换行?
答、使用反斜杠\
456、问fcntl的功能?
答、改变已打开的文件的性质。
457、问为了避免内核写文件时延迟写造成的数据丢失,可以采取什么方式?
答、调用函数fsync、fdatasync、sync
458、问什么是延迟写?
答、内核会将写入的数据放在缓冲区中,等缓冲区满了以后,再放入缓冲排入输出队列,
等到达队首以后,才进行I/O操作。
459、问fork()、dup()后,文件描述符指向了同一个文件表项?
答、对。
460、问lseek修改的是什么?
答、文件表中的当前文件偏移量。没有再进行其它任何操作。
461、详细给出进程打开文件时,内核中存在的与文件相关的数据结构?
答、进程表项(有文件描述符即对应的文件指针)、
文件表(文件状态标志的记录、文件偏移量的信息、及指向的v节点指针)、
v节点表(文件的长度、i-node、对此文件进行操作的函数的指针(输入输出));
其中进程表象可以在用户区。注意文件偏移量和文件的长度等信息的分离。
文件描述符对应的文件指针指向的是文件表。
462、问ssize_t和size_t的区别?
答、前者带符号后者不带符号。
463、问read函数读成功返回什么?不成功呢?
答、0;负数。
464、什么是空洞?
答、位于文件中但没有写过的字节。@;空洞并不要求占用存储区。
465、问lseek允不允许偏移量(第二个参数)大于文件的长度?
答、允许,但是会形成空洞。
466、什么情况下,lseek的返回值是负值?
答、如果是管道、FIFO、网络套接字,会返回-1.
467、问使用kill命令杀死进程有什么条件?
答、调用者必须是该进程的所有者或者是超级用户。待验证?
468、问fork()失败返回什么?
答、返回一个小于0的数。
469、问进程有没有工作目录?
答、有,chdir()改变的是进程的工作目录。
470、问是截断还是截短?
答、截短。
471、问如何判断目录中某个文件相对首个文件的位置?如何移动readdir(dir)时的游标,
使其偏移自定距离开始读目录?
答、long loc;
loc=telldir(dir);
seekdir(dir,loc);
472、问mv命令能移动目录吗?
答、可以。
473、问如何安全地使用mv命令?
答、mv -i
474、问将不同目录中的同名文件移动到相同目录,会出现覆盖现象吗?
答、会。
475、问opendir等目录函数的使用,必须要借用stat结构体和stat函数吗?
答、对。
476、问stat函数第一个参数是什么?
答、文件的路径
477、问S_ISDIR函数如何使用?
答、S_ISDIR(buf.st_mode);其中buf是struct stat类型。
478、问虚拟文件系统中的虚拟如何理解?该系统在内核还是磁盘?
答、虚拟是指内核中存在与磁盘中类似的文件系统结构,
但是文件信息只是磁盘中的部分,这样的文件系统称为虚拟文件系统;
该系统在内核。
479、问打开目录的过程是怎样的?
答、DIR *dir=opendir("***");
struct dirent *pdirent=readdir(dir);
480、问scanf使用时有什么缺点?如何解决由scanf给代码造成的麻烦?
答、scanf无法读入空格和换行等,使用fgets(buf,sizeof(buf),stdin);
以后需要从终端输入数据时,一律使用fgets(**,**,stdin);
481、工作时,如果写了太繁琐的代码有没有影响?
答、
482、问linux上查看命令文件的命令?
答、which。
483、问回到用户的home目录的方式?即/home/lzx/
答、char *path=getenv("HOME");
484、问chdir如何使用?能不能改变终端的工作目录?
答、在自己的程序中使用,而且这个效果也只能在自己的程序中出现;
不能改变终端的工作目录。
485、问linux改变根目录的函数?
答、chroot;
486、问Linux改变目录的函数?
答、chdir。
487、问能不能通过exec族函数执行cd命令?为什么?
答、cd是linux的内建函数,找不到路径和文件名,
而exec族函数的第一个参数就是路径或文件名。
488、问
if((args[1]!=NULL)&&(strstr(args[1],">")!=NULL)&&(args[2]!=NULL))//如
重定向指令,就将信息打印到自定义文件,用dup2改变文件描述符指针
{
int fd=open(args[2],O_WRONLY|O_CREAT|O_TRUNC,0777);
dup2(fd,1);
pid_t pd=fork();
if(pd==0)
{
// execl(pstart,pstart,NULL);//execl第一个参数必须是路径名
execlp(pstart,pstart,NULL);//execlp第一个参数是命令名
printf("fork works\n");
exit(0);
}
printf("execlp works\n");
}else
{
pid_t pd=fork();
if(pd==0)
....
有什么问题?
答、父进程改变了文件描述符1内的指针,使其指向打开的文件,
造成printf打印不出来。
489、问exec族函数的作用?为什么其中有些函数存在可变参数?
答、有时候执行命令后可以接很多可变参数,例如ls -a -l;ls -al;可变参数就是这个作用。
490、问
char * Creat_Env()
{
//用当前路径名作为shell的开始
char path[1024];
getcwd(path,sizeof(path));
printf("myshell@%s >> ",path);
//输入命令
char cmd[1024];
fgets(path,sizeof(cmd),stdin);
cmd[strlen(cmd)-1]=0;//讲换行字符变成\0
return cmd;
}
有什么问题?
答、cmd是局部变量,return后函数内存会丢失,返回的是一个无效的地址。
491、问exec族函数中第一个参数分别是const char *path、const char *file,
它们分别表示什么意思?
答、file表示可执行程序的文件名字(linux上所有的命令都是存储在文件中);例如ls;
如果用 ls(ls前加了空格)是不符合file参数的规定的。同理,path是可执行程序的路径。
492、问exec族函数名后缀l、v、p、e分别表示什么?
答、l list 用不定参数列表来表示命令参数,如果用不定参数列表,那么用NULL表示结束
v vector 用数组来传递命令行参数
p path 表示程序使用程序名即可,在$PATH中搜索该程序,不带p的需要提供全路径,没有带p的要用程序的路径名。
e environ 表示环境变量
493、问execle和execvpe函数使用时要注意什么?
答、因为结尾的e表示环境变量,必须在使用该函数的程序的全局区添加exter char **environ;
494、colon-separated?
答、用冒号分隔。
495、slash?
答、斜线
496、semantics?
答、语义。
497、variadic functions?
答、可变参数函数。
498、问
int main()
{
printf("hello world");
int i=0;
for(i=0;i<5;i++)
{
pid_t pid=fork();
if(pid==0)
{
exit(0);
}
}
for(i=0;i<5;i++)
{
wait(NULL);
}
return 0;
}
打印多少个helloworld?如果hello world变为hello world\n呢?printf中的数据什么时候会被打印到屏幕?
答、5个,因为printf会先将数据存储进去第一层缓冲区,不会直接放到内核中缓冲区,fork()以后,
第一层缓冲区中的数据也会被复制,因此等程序结束时,会刷新缓冲区一次,printf会打印出结果。
但是如果是helloworld\n就不一样了,因为\n会导致printf中的第一层缓冲区刷新,
数据直接被打印到屏幕。printf中的数据在遇到\n等字符会打印到屏幕;而且所对应的main
程序运行结束也会打印到屏幕。
499、问char *name=" abcde ";
char *tmp=strtok(name," ");
printf("%s",tmp);
结果是什么?能将abcde之后的空格也清除吗?
答、abcde;
因为strtok会将abcde前所有的空格位置'\0';但是之后的空格显示出来不影响效果。
500、问uname的作用?
答、查看是不是linux系统。
501、问
int tmp;
struct student s;
int fd=open("s.info",O_RDONLY);
read(fd,&s.age,sizeof(s.age));
read(fd,&s.score,sizeof(s.score));
int len;
read(fd,&len,sizeof(len));
s.name=malloc(len+1);
s.name[len]='\0';
有什么问题?
答、没有考虑到大端和小端问题。因为在磁盘上都是按照大端方式存储;但是在内存中存在大端和小端问题。
一旦涉及到文件从不同系统之间交换文件,就一定会有大端和小端问题。
502、问如果两份程序代码内容完全一致,但是运行结果不一样,这是什么原因?
答、最可能是字体不一样。
503、问整型数据、字符型数据等,最好在一块定义?
答、对。
504、问vim如何查看关键字的信息,例如宏?
答、[再按d
即左中括号d
505、问磁盘中真正占用空间的文件有哪些?
答、普通文件、目录文件、软链接。
506、问套接字在linux中本质是什么?
答、linux文件的一种类型。
507、问大型游戏是如何做到及时地切换画面?
答、提前缓冲图片数据。
508、问qq属于c/s模式吗?还有其它的c/s模式的应用吗?
答、是。还有游戏lol
509、问实时系统如何实现?
答、信号。c语言中signal.h头文件。
510、什么是注册函数?常用的注册函数有哪些?
答、先调用函数,等程序执行到这个位置之后的某个特定的地方,再将参数传递到调用的函数,
这个调用函数代码就是注册函数。
onexit;
signal;
511、问
...
pid_t pd=fork();
if(pd==0)
{
printf("aaa");
}
wait(NULL);
...
且父进程是不停止的。类似shell
这个程序有什么问题?如何改进?
答、子进程也会调用wait(NULL);因为子进程没有它的子进程,
所以子进程不会在wait处阻塞。直接返回1;继续执行下面的代码。
但是父进程也会执行wait代码,父进程有子进程,而子进程又没有死掉,
所以父进程会阻塞,不会执行接下来的代码。如果是shell,
就会不断开辟子进程。
代码改成
...
pid_t pd=fork();
if(pd==0)
{
printf("aaa");
exit(0);
//return 0;注意return 0是不能用的,因为只会造成函数退出,不会终止进程。
}
wait(NULL);
...
512、问如何创建带空格的文件?例如aaa bbb;
答、mkdir “aaa bbb”;
513、问如何防止忘了写free()?
答、一旦写了malloc或strdup就在后添加free;
514、什么叫把标准输出重定向到文件?
答、将打开的文件的文件描述符内的指针拷贝到标准输出的文件描述符1内。
515、问linux重定向功能是如何实现的?
答、通过dup函数。
516、问exec族函数使用时要注意什么?
答、第二个参数必须要带有哨兵。例如、execvp函数的第二个参数是char *const
argv[];那么必须要让argv数组最后一个元素是NULL;例如execl函数的第二个参数是const char *arg;
arg指向的字符串最后一位必然是'\0';
517、问如何查找机器名?
答、cat /ctc/host;
518、问如果局域网冲突了怎么办?
答、windows cmd下输入命令:ifconfig /renew
519、举例说明进程组的应用?
答、qq群。
520、问什么是硬链接数据量?
答、目录链接到文件的个数。
521、问什么是虚拟文件系统?
答、内核中也建立了一套和磁盘类似的文件系统,只是只存储了部分数据。
522、问数据在磁盘上存储有没有大端和小端的概念?
答、没有,在磁盘上按从低到高存储。
523、问大端和小端是由系统中什么决定的?
答、系统分硬件系统和软件系统;大端和小端是有cpu决定。因为在最开始cpu生成商很多inter、IBM
没有一个统一的标准。所以留下了大端和小端问题。
524、怎么判断一个电脑的系统是大端还是小端对齐?
答、可以用程序判断,如下
int main()
{
int a=0x12345678;
char *p=(char *)&a;
printf("%d\n",*p);
}
525、问htons、htonll有什么作用?s表示什么?ll表示什么?htonl中的l表示什么?
答、s表示short int;ll表示长整型。表示32位整型。
526、问s.age=ntohl(tmp)中函数ntohl的作用?
答、将数据转换成小端。
527、问浮点数存储数据有什么缺点?
答、不同的机器解析浮点数是不一样的,因此让程序缺乏可移植性。
528、问单字节(字符串)和浮点数有大端小端的概念吗?
答、没有。
529、s.age=htonl(s.age);问htonl函数的作用?
答、将整型数据转换成大端。
530、给出使用open创建新文件的函数代码?
答、int fd=open("s.info",O_WRONLY|O_CREAT|O_TRUNC,0777);
531、问strdup函数的作用?
答、s.name=strdup(buf);buf是char buf[2048];s.name是char *类型
s.name首先申请了和buf大小相同的堆空间,然后将buf中的数据拷贝到s.name的堆空间。
532、问
malloc(a-1);
int b=c+a-1;
这种写法有什么不好?
答、a-1重复出现两次,应该用一个变量代替。这是为了使得代码变得更规范。
533、问
...
memset(buf,0,sizeof(buf));
int ReadLength=LengthFile>sizeof(buf)?sizeof(buf):LengthFile;
read(fd1,buf,ReadLength);
write(fd1,buf,ReadLength);
LengthFile-=ReadLength;
if(LengthFile<=0)
{
break;
}
...
这段代码有什么问题?
答、read和write的文件描述符都是fd1.
534、问如何通过文件描述符移动文件结构体中的指针指向?
答、lseek;
535、问如何在vim命令下键入man 查询命令?
答、:! man 2 stat;
注意一定要先加:!再输入命令。
536、问truncate函数的作用?ftruncate函数的作用?
答、它们都是用来截断文件(拉长文件,缩小文件);但是truncate的参数是路径、截断后大小;
ftruncate的参数是文件描述符、截断后的文件大小。
537、问
struct st
{
int a;
char *b;
}
int main()
{
}
有没有变量?
答、没有。只是定义了结构体,没有定义变量。
538、问java和javascript有没有关系?
答、它们是区别的,是两种不同的语言,而且做的事也不一样。
539、问exit函数和_exit函数的区别?
答、exit函数调用了_exit函数;_exit函数更偏向于底层。
540、问多线程和多进程的最大区别是什么?
答、多线程可以更好地共享全局变量。
541、问PCB在哪存在?
答、内核。
542、问进程的PCB是由什么代码定义的?
答、task_struct结构体。
543、问强制退出进程的最好方式?
答、ctrl+\
544、问fork为什么会有两个返回值?
答、一个是fork函数将父进程的PCB数据拷贝到子进程的PCB后,子进程被创建,
fork函数在父进程中成功执行,父进程返回一个大于0的值;
然后子进程的PCB中由于保护了现场,并从父进程的fork处进行执行,
但是fork函数只是为了增加子进程而设置,此时的子进程再执行fork,
显然是不会成功执行的,所以fork会再返回0;
545、问PCB最有特点的功能是什么?
答、保存进程现场。
546、问mylog(const char *file,int line,const char *fmt,...);//fmt的作用?
答、相当于哨兵。
547、问add(int count,int a,int b,...)count是什么含义?
答、count表示出了a,b以外还有多少个参数。
548、问能不能设置一个进程号为组长?
答、可以,通过函数setpgid.
549、问使用setsid()函数要注意什么?
答、组长不能使用本函数创建会话。且一个进程的组ID是可以变换的。
550、问创建会话的函数?
答、setsid();
551、问
int main()
{
pid_t pid=fork();
if(pid==0)
{
setsid();
getchar();
}
}
问子进程能不能接受到getchar()信息,从而控制子进程的执行?
答、不能。此处不能用getchar()代替sleep,因为getchar作用与会话,
建立了一对一的联系,但是独立过后,子进程已经不属于本会话,
所以是不会接收到这个终端上的任何人输入的信息。
552、开始执行的第一个进程会默认变成group leader吗?
答、会。
553、问领导进程(group leader)不能调用setsid函数创建一个新的session?
答、对。
554、问一个前台进程组在运行,如果用ctrl+c;这个进程组所有进程都会接受吗?
答、都会。所以都会退出。
555、问一个会话最多有多少个前台进程组?
答、一个。
556、怎样让一个程序在后台运行?
答、在末尾加上&。
557、会话的意义?
答、将多个工作囊括在一个终端,并取其中的一个工作进程组为前台,
接收人通过终端输入输出的信号,而其它工作进程组放在后台运行。
558、问用户在linux上输入信息必须要借助什么?
答、终端。
559、问终端产生的信号会传到哪?
答、用户向终端输入命令,终端将信号传递给前台进程组。
560、问会话的前台工作是什么?后台工作是什么?
答、前台工作是一个进程组;此时后台工作就是其它的进程组。
561、问终端连接的对象是什么?
答、一个会话session;
562、问关于会话session,一个工作指的是什么?
答、会话中的每一个进程组。
563、问session ID即SID是由什么决定的?
答、会话领导进程的PID;
564、问会话是由什么组成的?
答、是由多个进程组的组进程组成的。
565、问什么时候进程的组PGID会消失?领导进程的终结会不会影响组PGID?
答、进程中最后一个进程终结。不会。
566、问进程之间关系的分类是怎样的?
答、父子关系、组关系、会话关系。
567、问设置进程的组ID的函数是什么?
答、setpgid;setpgrp(视版本不同而用)
568、问int fd=open("b.txt",O_WRONLY);
如果b.txt不存在,能不能运行成功?
答、不能。
569、问exec工作之前和之后的属性哪些是相同的?
答、进程ID和父进程ID;账户相关、进程组相关、定时器、当前目录和根目录、umask、
文件锁、信号mask、未决的信号、资源限制、进程优先级、进程时间、
没有close-on-exec属性的文件描述符。
570、问execl函数的作用?
答、将运行这个函数的数据段、栈、堆等全部替换成execl函数参数中指定的
程序,但是进程属性不会改变。功能很像鸠占鹊巢。
571、孤儿进程是什么?
答、父进程死掉,但是子进程没有,那么子进程的父进程会被设置成init进程。
572、僵尸进程出现的背景是什么?在什么情况下最能凸显这个概念?
答、永不停歇的后台服务进程。僵尸进程的出现占用了内存的PCB。
573、概括wait函数的作用?
答、一、收尸;二、感知进程状态的变化。(stop-running;running-stop)
三、获取子进程的结束状态。
574、问int status;wait(&status);
程序运行成功后,status有多少位?如何得到特定功能的位号?
答、其中只有8位用于保存子进程return的值,但是其它位有其它用途。例如:WIFEXITED(status)会判断子进程有没有结束,WEXITSTATUS(status)返回的是子进程结束时return 的值。
575、md5sum file1;
md5sum file2;
问如何通过结果判断两个文件是不是相同的文件(长度、内容都相同),md5sum是什么?
答、如果是相同文件,那么它们的第一个输出结果一定是相同的。md5sum是文件指纹。
576、问一次wait能回收多少个僵尸进程?
答、一个。
577、问wait函数的返回值是什么?有什么含义?
答、表示要回收的进程的pid号。
578、问如果子进程退出,怎样防止发生内存泄漏?
答、子进程退出,父进程虽然会清除子内存的物理内存等资源,
但是子进程的PCB是不会被回收的,除非父进程通过wait函数清除PCB。
如果没有清除,那么这个子进程就会变成僵尸进程。但是如果父进程也死了,
子进程的PCB也可以被清除。
579、问linux和windows系统的最大区别?
答、windows系统的图像进程是在内核中,而linux系统的图像进程是在用户层。
580、问进程退出时,内核如何处理进程的数据?PCB也会被清除吗?
答、清除申请的内存(物理内存、栈空间、堆、代码段、数据段),
文件描述符会被关闭。它的PCB不会被清除。
581、问子进程和父进程有什么不同?
答、fork返回值、进程ID、父进程ID、程序运行时间记录,在子进程中被清零、
文件锁没有被继承、闹钟、信号集合。
582、问通过什么机制可以实现进程间通信?
答、mmap;内存映射。
583、简述子进程继承了父进程的哪些属性?
答、文件描述符、账户/组ID、进程组ID、会话ID、控制终端、set-user-ID和set-group-ID、
当前工作目录、根目录、umask、信号掩码、文件描述符的close-on-exec标记、
环境变量、共享内存、内存映射、资源限制、
584、问使用fork函数创建子进程,子进程中会和父进程公用相同的变量吗?例如int a;如果是文件描述符呢?
答、不会,但是如果是文件描述符,它们是共用同一个打开的文件的。
585、问在Linux上执行程序,有没有通过fork()函数?
答、有。
586、问fork()函数的返回值是怎样的?
答、fork()函数会返回两个值;当值大于0时,表示的是父进程;当值小于等于0时,表示的是子进程。
587、问fork()函数的功能?
答、fork可以在内核中拷贝一份与原进程相同的PCB,既然是正在运行的PCB,就一定会执行。所以通过这种机制创建了子进程。
588、问fork()后的子进程会不会再执行父进程fork()之前的代码?
答、不会。
589、问理解进程要从哪几个方面理解?
答、进程属性、进程控制。
590、问linux的账户功能是怎样的?
答、账户是一个数据结构,功能主要体现在进程上,进程中会有账户属性,
这个账户属性可以赋予进程操作文件的权利。
591、问printf(“%s %d”,a,b);
哪个是printf的哨兵?
答、%号。
592、问什么是前台进程?
答、能捕获到用户输入的进程。
593、问main函数为什么要返回return 0?
答、第一、return 的结果会被保存在PCB中,让main函数的父进程知道。否则这个main函数对应的PCB中的return值是未知的。
第二、有时使用了on_exit函数,需要根据return的值进行调用,
如果没有return返回值,或者exit(1)等能够返回到PCB的值,
这个函数就不会被调用。注意到main函数执行时的程序是一个子进程,
它是由父进程调用的,子进程运行结束,必须返回值给它的父进程,
不然父进程不知道,而且这个值也会被保存在内核的该进程的PCB中;
如果异常退出,应该避免程序的异常退出。
594、问进程的结构体中有没有环境变量?子进程会继承父进程的环境变量吗?
答、有关于环境变量的信息。会继承。
595、问文件结构体和文件描述符的区别?
答、每打开一个文件,都会为磁盘上的这个文件创建一个结构体,而文件描述符属于进程,
里面的指针,指向了文件结构体。
596、问windows上操作目录的函数的头文件?Linux呢?
答、direct.h;
dirent.h;
597、问杀死进程的命令?
答、kill -kill +进程号。
598、问如何在全局区申请内存?
答、brk;
599、问获取当前目录的命令?设置当前目录的命令?修改当前目录的命令?
答、getcwd;chdir;chroot;
600、问如何保证窗口关了以后,程序任然能够执行?
答、设置程序的session号。
601、问子进程的父进程死掉了,子进程的父进程号还会是父进程的进程号吗?子进程的组ID会改变吗?
答、不是,会选择一个程序的进程号作为父进程号。不会。
602、问int a=100;
int arr[a];能不能在linux上定义成功?
答、可以。
603、问alloca申请的内存在哪?
答、栈。
604、能不能用mmap申请内存?
答、能。
#include"../header.h"
int main()
{
void *ptr=mmap(NULL,
4096,
PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANON,
-1,
0);
strcpy((char *)ptr,"hello");
}
605、给出制作静态库及使用的过程?
答、①、先编写好静态库代码,例如607中的lib.c;
②、ar rcs libmylib.a lib.o生成相应的libmylib.a文件
③、编写测试代码,例如607中的ICE7.c;
使用命令gcc ICE7.c -lmylib -L. -static;
606、问export LD_LIBRARY_PATH.设置环境变量的有效期是怎样的?如何保证在任何新开的终端都有效?
答、只能在当前终端有效。在其它终端不行。
可以在/etc/profile中设置。
607、简述动态库的制作及使用过程?
答、①、写出动态库的代码,注意不能有main函数;例如lib.c
#include<stdio.h>
int a;
int main()
{
prinf("abcd");
}
②、在shell中使用gcc -shared -fpic -o libmylib.so lib.c;生成libmylib.so文件,动态库已经制作完成
③、使用过程如下:在程序中
用extern进行声明(提示存在函数,不过是在其它文件中);动态库中定义的全局变量也要通过这种方式声明;例如ICE7.c
例如extern void foo();
extern int a;
int main()
{
a=100;
foo();
}
④、使用gcc ICE7.c -L. -lmylib编译写好的程序;其中-L.提示在当前路劲寻找动态库,在当前路径寻找程序之前,
要在环境变量中寻找,没有找到才能在当前路径中寻找;编译成功后进行下一步。
⑤、使用export LD_LIBRARY_PATH=.将④中生成的a.out文件的路径加入到环境变量中。
⑥、
608、问如何将后台的程序调到前台?
答、fg 1;
609、问如何查看在后台中的程序?
答、jobs;
610、问如何将前台进程切换到后台?
答、ctrl + z;
609、问什么是前台进程?
答、输入cat以后,再输入,此时cat就是前台进程。
610、问ps aux命令后,进程的状态显示Ss,这个进程是什么进程?+号表示什么?
答、这个进程是会话组的领导进程。+号表示进程是前台进程。
611、简述进程的状态?
答、6种:可运行状态、中断等待状态、不可中断等待状态、僵死状态、停止状态、交换状态
612、环境变量的结构?
答、等于号左边是变量后边是值。
613、问进程的账户和组带给了进程什么功能?
答、这个进程的权利(能否操作其它用户进程和文件)。
614、问进程编号会不会按降序分配?类似进程的文件描述符?
答、不会。
615、问虚拟地址映射的物理内存,一块的单位是多少?
答、4k。
616、问有没有进程不占cpu?
答、getchar();
617、问两个不同进程之间传递地址有没有意义?
答、不能传递成功,因为它们是虚拟地址。
618、给出task_struct的位置?并说出作用?
答、task_struct在文件/usr/src/linux-headers-3.13.0-119/include/linux中,文件是sched.h。
进程根据task_struct初始化进程的PCB。
内核为每一个进程创建管理程序时必须要用到。
619、问在当前目录找文件的命令?
答、find -name “linux”;
620、问内核是通过什么来控制进程?
答、PCB。
621、问进程的状态在哪?
答、在ps -aux命令或ps -ajx命令执行后显示出来。
622、问终端是什么?
答、一个程序。
623、问linux的内核进程启动后再执行什么程序?
答、必定会执行init程序。
624、问操作系统在未开机前,数据存储在哪里?开机的作用?
答、硬盘上。开机就是将操作系统从硬盘转到内存上。
625、请简述linux上一条命令时如何被执行的?
答、首先shell进程会告诉内核命令的文件位置,然后内核调用文件,并执行;
626、问atoi函数使用时,能不能要求buf中有换行符?
答、不能。
627、fgets(buf,sizeof(buf),fp);
mkdir(buf,0777);
问有什么问题????
答、没有考虑到fgets回
628、问Linux的目录能不能有换行符?
答、不能。
629、问如何删除目录及目录中的文件?
答、rm -rf c;其中c是要删除的目录名。
630、问管道的作用?
答、将前面的输出当做后面的输入。
631、问printf中有没有调用系统调用?
答、有。
632、问加了中括号的进程是什么进程?
答、内核进程。
633、问进程结构是怎样的?
答、树型结构,除了init之外的每个进程都有一个父进程。
634、问指针变量保存的是什么?
答、虚拟地址。
635、问PCB的作用?
答、描述进程的属性和状态。
636、问PCB是哪个单词的简称?
答、process control block;
637、问单独的ps查看什么信息?
答、当前终端的进程。
638、问ps是哪个单词的缩写?
答、process status。
639、问linux上的第一个用户进程是什么?
答、init进程。
640、问shell是不是内核程序?
答、不是。但可以和内核互动。
641、问stat函数如果运行失败,返回什么?
答、-1;成功返回0;
642、问能不能通过opendir函数判断文件类型(目录文件还是普通文件)?
答、不能,必须通过stat函数。
643、给出常用的操作目录的函数?
答、opendir、closedir、readdir、rewinddir;
644、问mkdir c/b -p的作用?
答、如果目录中没有c目录会自动添加c目录后,再在c目录中添加b目录。
如果不加-p;就不能创建,会报错。
645、问unlink和rmdir也是函数吗?
答、是。
646、给出删除文件的两种方法?
答、unlink a.txt;
rm a.txt;
647、file结构体里存储了文件描述符信息?
答、对。
648、问什么时候a.out要加上sudo?
答、当a.out文件涉及到修改文件的属性时,因为文件的属性往往存放在内核,
所以要用root权限修改。
sudo ./a.out.
649、问如果abc->bbb;
文件abc是文件bbb的软链接,那么stat abc出现的文件信息时链接文件还是被链接文件?
答、链接文件abc。
650、问隐藏的文件通常有哪两种?
答、.和..
651、问inode结构体有没有限制?可以无限多吗?
答、有限制,不能无限多。
652、目录文件的数据域存储的是什么信息?
答、inode number以及目录中的文件名。
653、inode的本质?
答、结构体。
654、问inode空间大小只有128-256字节,其中除去记录文件信息的结构体大小,
剩下的空间都用来存放指向数据信息的指针,而磁盘本身不是线性的,
所以inode中指向数据部分是通过指针的方式,那么如果inode空间不足怎么办?
答、inode会采取二级指针或多级指针的方式进行数据存储;借用二级指针去理解,
就是inode会拿一个指针区域指向一个数据区域,而这个数据区域内存放的都是inode指针,
指向其它的数据块。借此扩大了存储空间。同理三级指针和四级指针也是如此。
655、stat里面存储的信息和inode的关系?
答、实际上stat结构体里面的信息都是inode里面的。
656、问inode标识的结构体存放在哪?
答、磁盘。
657、给出改变文件长度的方法?
答、write、truncate、st_size保存文件的长度。
648、给出得到文件长度的方法?
答、ls、wc -c、stat;
649、能不能去掉/tmp目录的stickbit位?
答、不能。因为tmp是公共目录,去掉会不安全。
650、添加用户的命令和删除用户的命令?
答、adduser和useradd;增加。
userdel删除。
651、问stickbit的作用?如何设置?
答、如果对文件设置这个权限,当文件运行退出后,系统中仍然有该文件的映像,再次运行时,不需要加载;
但是占用了内存。但是如果是对目录设置了这个属性,用户只能删除和修改它自己创建的文件,
对于其它账户创建的文件,它不能修改和删除。特别是公共目录,一般有这个属性。例如/tmp;
chmod o+t;
chmod o-t;
652、问如何设置文件的用户和文件的组?
答、shell命令sudo chown lzx:root dir2;
653、问chmod u+s dir2命令有什么问题?改正后,有什么效果?
答、没有加sudo;所以是无效的。再通过sudo chown lzx:root dir2;
(可以将dir2文件变成所有者lzx;组用户名root;那么在这个目录下创建
的文件组用户都是root;
654、问用户和组是什么的属性?
答、进程。
655、问如何查看账户的信息?如何查看密码?
答、cat /etc/passwd;其中密码都用x表示。
想要查看这里面的密码信息,必须先查看shadow;可以通过cat /etc/shadow;
查看shadow文件的权限等信息。结果显示只有root用户可以对shadow
文件进行写操作,这个时候,必须用命令ls -al /usr/bin/passwd
查看平时改root密码时使用的命令passwd(通过which passwd可以得到
这个路径),就能看到s权限被设置(USID);有没有觉得奇怪,
改密码可以用普通账户修改,但是只有root账户可以向管理密码账户
的文件中写信息?说明passwd命令被提升成了root权限。
656、如何安装vim插件?
答、sudo apt-get install ctags;
在工程目录下执行vim,并ctrl+p;生成tag文件;
ctrl+o,显示目录树。
光标停在函数处,用ctrl+],跳转到函数的定义(无论在不在新的文件都可以),然后按ctrl+t可以返回。
按F4,出现标识符导航。
ctrl + p是补全提示。
:A在相应的.cpp和.h之间进行替换。
:AV同时打开.cpp和.h文件。
657、如何在两个分屏间进行切换?
答、ctrl + w +w;
658、问linux分屏时如何将已有的文件加入新开的分屏?
答、:split a.txt;
659、问linux的分屏快捷键?
答、:split;命令行输入。竖向分屏:vsplit;
660、问linux执行外部的shell命令的快捷键?
答、冒号加感叹号;:!ps aux;命令行输入
661、问如何从反向搜索字符串?(头文件是string.h)??
答、rindex;
662、问修改目录的函数?
答、chdir;
663、问打包文件要不要将隐藏文件考虑进去?
答、要。
664、给出文档替换字符串的命令?如果被替换的字符是特殊字符怎么办?
答、:%s/worldx/xxxxyyy/g;
如果是特殊字符,要用\转义。
例如将/替换重abc;
:%s/\//abc/g;
665、问如何快速查找文档中出现的world单词?快捷键是什么?
答、光标移动到单词,按#号就能以不同的颜色显示出所有world单词。
按n(N)可以在这些world单词中切换;也可以在命令行中输入/world进行查找;
666、问Linux快捷键剪切?粘贴?复制?剪切单词?复制单词?撤销和反撤销?替换字符?删除字符?
删除连续的多行?
答、dd;p;yy;(三个都是行);dw(具有自动判断单词的功能);yw(复制单词);
u是撤销;ctrl+r是反撤销。r(替换字符,不进入编辑模式);R(替换字符,
并进入编辑模式);x删除字符;3dd或d3d删除连续的多行(从光标开始);
yy和dw以及yw和x前都可以带上数字,用来表示同时操作多个数据,
且数字可以在中间。
667、linux快捷键如何移动到文本行首?如何移动到文本行尾?如何跳转到
指定行?
答、gg、G;在下面输入:6;其中6是指定行;
668、问linux快捷键如何跳到行尾?如何从行尾跳到行首?
答、命令模式,按下A;
命令模式,按下I;
669、问查看系统核数的命令?
答、cat /proc/cpuinfo | grep processor | wc -l
670、问查看某个目录下有多少个文件的命令是?
答、ls | wc -l
671、linux的哲学是小的就是美的。这种哲学是如何体现的?
答、从shell命令可以看出来;
cat /proc/cpuinfo | grep processor | wc -l
672、问long型的数据,用什么格式符输出?
答、ld。
673、问rewinddir的作用?
答、读目录中的文件信息后,可以在过程中将指针设置到开头,再读目录中的
文件信息一次。
674、问.和..开头的是什么文件?
答、隐藏文件。
675、问如何使vim文档规整?
答、光标移动到开头gg -G;
676、问文件名是不是文件的属性?
答、不属于,属于目录的信息。
677、问打开目录的函数?
答、opendir。
678、问mkdir c/b -p作用?
答、创建多层目录。
679、问删除文件的命令?
答、unlink;但是该命令不能删除目录;删除目录是rmdir。(但是只能删除空
目录)
680、不同的进程打开相同的文件,什么是一样的?
答、inode。
681、问简述打开文件的工程?
答、文件描述符指向了inode,inode指向了包含文件的信息的结构体。
682、文件描述符实际上是什么结构体的下标?
答、文件结构体。
683、问cpu中存储数据的装置有哪些?
答、寄存器、l1、l2、l3(cache)
684、问cpu能不能访问硬盘?必须通过内存?
答、不能。内存
685、给出伪造文件时间的函数?
答、utime。但是文件属性的修改时间不能改变;只能改变内容访问时间和内容
修改时间;
utimes;可以精确到毫秒。
686、问创建链接的函数?
答、link;会导致引用计数加1;硬链接
symlink;软链接。
687、问检查文件能不能被读写执行的函数?
答、access。
688、struct stat buf;
stat(“dir2/abc”,&buf);
printf("%d\n",(int)buf.st_ino);
其中abc是软链接。链接到aaa文件
问打印的是链接到的文件,还是软链接本身的文件?
答、链接到的文件,和shell命令中的stat结果是不一样的。这种现象叫做跟随。
但是将代码中stat换成lstat;就能打印软链接本身的文件信息。
689、问如何查看链接文件的链接路径?
答、readlink abc;
690、问stat 软链接文件,得到的是被链接的文件属性,还是链接文件属性?
答、链接文件属性。
691、问inode的字节数?
答、128或256;
692、软链接是如何实现的?
答、软链接是一个文件,有自己的inode,数据块中保存了一个路径。
693、问如何查看软链接和硬链接的引用计数信息?
答、ls -al;软链接不改变引用计数。
694、问软链接有没有分区和目录限制?
答、没有,都可以。
695、问能不能跨分区进行硬链接?为什么?
答、不能。一个简单的理由是因为不同分区存在相同的inode号;所以不能区分
是本分区还是其它分区。
696、问目录能被硬链接吗?
答、不行。
697、ln -s file1 file2中的s的含义?
答、soft;软的。
698、问硬链接的命令?
答、ln file1 file2
699、能不能通过ls -al查看inode被引用了多少次?
答、可以。在权限信息后。
700、问有没有可能有多个数据块记录了同一个inode信息,指向同一个inode?
答、有可能。
701、问目录项和目录项之间通过什么划分?
答、/
702、问什么是map表?
答、记录了inode有没有被使用的表。
703、问目录有没有inode?
答、有,inode指向的数据块存放了文件名。以及文件的inode。
704、问文件是如何拓展的?
答、通过二级指针、三级指针进行拓展;
705、问文件名存放在哪?
答、文件所属的目录文件中。
706、问extern4中数据块的大小单位?
答、4k。
707、硬盘的结构是怎样的?
答、分成两个部分,一个部分存放着管理信息如inode;另一个部分存放着数据信息。
708、boot block?
答、启动块。
709、问文件系统的功能是什么?
答、在线性存储空间(硬盘)中,实现树形的数据结构。
710、问wc -c file是什么命令?如果在程序中呢?
答、查看文件的单词数,有多少个字符;
wc -l file:类似,查看多少行。
fseek和ftell;stat;lseek都可以。
711、问cd -是什么命令?
答、返回到上次的目录;但不能返回超过两次,而且只能在最近的两次间进行切换。
712、问/tmp/目录的特点?
答、目录其它用户权限位存在权限t;造成不同用户在这个目录中创建的文件是安全的。
其它用户不能删除这个文件。
713、问SGID设置的是什么?
答、类似SUID,不过设置的是组上的S、s信息。而且只能设置目录;设置后,
在该目录中创建的文件的所有组是root。
714、问ls -al后出现的文件详细信息中,有那两个所有信息?
答、用户、组
715、问which查看命令的路径功能又什么作用?
答、which查看命令的路径后,可以用ls -l +路径;就能知道文件的权限情况。
716、问密码在哪个文件?
答、/etc/shadow
717、问如何确定进程的账户?
答、谁执行了这个进程,这个进程就属于谁。
718、问文件的权限包括哪几种?
答、文件所属的账户(可以通过chown改变)、执行该文件的进程的账户
719、问SUID是什么?如何设置?如何取消?
答、文件的权限与r、w、x权限相似;一般启动的进程就是执行进程的用户;
而不是文件的所属账户;但是设置了suid后,启动的进程属于文件所属的账户,
而不再是执行进程的程序;即(进程中的进程所属信息不再像常规一样)
chmod u+s a.txt;
结果可能是类似-drS或-drs(如果是S,说明该位置对应的执行权限是没有的,
反之如果是小s,执行权限是有的)
chmod u-s a.txt;
720、问如何确定文件的所有者?
答、哪个用户的进程创建了文件,这个文件就属于谁。
721、linux中有哪些文件是存放在硬盘中的,真实存在的?
答、普通文件、目录、链接。
722、问execlp函数中的p的含义?
答、在PATH的环境变量中寻找程序。
723、问int fdo=open(dstfile,O_WRONLY|O_CREAT,0777)?
有什么问题?
答、没有考虑到文件存在时本函数不能用,应该改为
int fdo=open(dstfile,O_WRONLY|O_CREAT|O_TRUNC,0777);
724、问进程控制块PCB在哪?
答、内核。
725、什么函数可以改变根目录?什么时候可以改?
答、chroot();在系统中构建子系统,
726、什么函数可以改变程序当前运行的工作目录?
答、chdir();
727、问cd的全称是什么?
答、changedirectory;
728、问如何知道程序运行了多长时间?
答、time ./a.out test aaa;
729、问文件描述符在哪?
答、进程控制块。
730、问切换进程到后台运行的命令是什么?又该如何换回?
答、ctrl z(中断显示^z);fg 1可以换回。
731、给出查看环境变量的两种方式?
答、vim /etc/profile;
vim ~/.bashrc
732、问sudo chmod u+s a.out的作用?
答、改变a.out的文件权限-rwsrwxr-x;使得文件是属于用户的,但是执行是按root用户执行。
734、问如何查看用户的id信息?
答、cat /etc/passwd;
735、问进程号从什么编号开始?
答、1、不是0
736、问如何查询cpu的核数?
答、cat /proc/cpuinfo | grep processor
如果结果是processor:0也没关系;因为0表示0号说明有1颗cpu。
737、问编译形成的a.out文件在哪?
答、磁盘。
738、问
int data[1024*1024];
int main()
{
return 0;
}
编译以后,形成的a.out文件的大小有没有将data数据的大小包含进入?
如果data[1024*1024]={1}呢?有什么启发?
答、没有,因为此时的data数组放在全局区bss段,只是被告知存在这样大小的数据。
此时a.out文件所占的磁盘空间是不大的。但如果是后者文件大小就包含了data
数据的大小。显然占用了更多的磁盘空间。所以最好不要初始化。
739、为什么进程要用虚拟地址?
答、为了防止进程直接访问物理内存,起隔离作用;
不然操作系统会被搞死。
740、问查看用户进程的命令?
答、ps aux;更详细的命令时ps ajx | more。
741、问realpath的作用?
答、得到相对路径的绝对路径。
742、builtin?
答、内键指令。
743、什么是linux内置命令和非内置命令?如何查看?
答、能通过which查找出路径的就是非内置命令ls;
反之就是内置命令(cd)。
可以通过type命令查看,例如
type cd;
747、问/dev/null文件是什么文件?
答、可写文件,无论什么数据写进这个文件,数据都会被丢弃。
作用,可以重定向1号文件描述符,到这个文件,打印10000个printf,
使所有printf无效。
748、问/dev/zero文件是什么文件?
答、只读文件。永远不会读完,而且数据都是零;作用是初始化。
749、问如何使用dd拷贝文件?
答、一、dd if=/dev/sda1 of=aaa bs=1k count=10;
将sda1分区中的数据拷贝100k到新文件aaa
二、dd if=day01.tar.gz of=xxx
从文件day01.tar.gz中所有信息拷贝到文件xxx;
750、问删除文件的命令rm实际上是调用了什么?
答、unlink和rmdir。
751、用ln创建硬链接或软链接的区别是什么?
答、加-s能创建硬链接,不加是软链接。
752、问硬链接是普通文件吗?
答、是。
753、问time_t是什么类型的数据?
答、32位的整数。
754、问怎样通过写代码改变文件时间?
答、函数utime。
755、说出touch的两个作用?
答、改变文件的三个时间;创建文件。
756、问删除目录的命令?
答、rmdir。
757、问删除文件的命令?
答、unlink。
758、问不同分区的文件能够建立硬链接关系吗?
答、不能。
759、问目录能允许被硬链接吗?为什么?
答、不能。如果目录可以,容易造成死循环。
760、问linux上如何在用vim打开时就能跳到指定行?
答、vim a.c +33;
761、问linux上如何查找?
答、命令下输入/+查找内容。
762、举出块设备的例子?
答、磁盘。
763、问如何选择open和fopen?
答、选择fopen,因为跨平台。
763、问如何在/dev/zero/目录下,创建一个所有权是a,块大小是1k,总共是4块的文件?
答、dd if=/dev/zero of=a bs=1k count=4
764、问linux中磁盘名一般是怎样的?
答、sda、sdb
765、怎样知道cpu的核数?
答、cat /proc/cpuinfo | grep processor | wc -l;
766、问线程的数量多少最合适?
答、cpu核数的两倍。
767、如何查看Linux的版本信息?
答、cat /proc/version
768、接口的本质是什么?
答、某个物与另外一个物之间交换信息时的机制。(当然是因为它们不能直接交换信息啦);
769、问如何查看磁盘信息?
答、cat /proc/diskstats
770、lib64、mnt、root、srv、usr、boot、etc、lib、lost+found、opt、run、sys、var、cdrom、home、media、proc、sbin
问给出里面存放的内容?
答、
lib64(64位)的库、mnt(挂载设备)、root超级用户的工作目录、srv用的比较少一般是空的、usr里面有一些目录包括bin目录,
该bin目录中存放vim等非系统程序,另外一些库文件(例如c语言的include)也会在usr库里、boot是启动目录、
etc存放配置文件(.conf、/etc/profile)的目录、lib库(一般usr目录里的lib库中的文件使用最多)、
opt可有可无的、run服务程序、sys设备、var(文档例如网页)、cdrom(光盘)、home(Linux)账户们(lzx、
xzl)工作目录(lzx、xzl)、media(多媒体例如u盘)、proc(内存目录像CPU、内存、磁盘的配置信息)、
sbin(服务器程序,后台持续运行的bin,s表示system系统的意思)
771、问根目录下initrd.img和vmlinuz是什么文件?
答、为linux启动服务。它们是软链接。
772、问bin中一般存放什么文件?如何检测?
答、二进制文件、可执行文件
命令ls ls;
命令 which ls;
773、chmod除了是shell命令,还能是什么?说明什么?
答、系统函数。说明linux上很多shell命令还能是函数。
774、问linux上用来测试文件的权限位的宏有哪些?如何使用
答、S_IRUSR//用户读
S_IWUSR//用户写
S_IXUSR//用户执行
S_IRGRP//组内读
S_IWGRP//组内写
S_IXGRP//组内执行
S_IROTH//其它用户读
S_IWOTH//其它用户写
S_IXOTH//其它用户执行;
以上这些是宏,通过与stat结构体中st_mode相与得到结果。
775、对于跨用户的文件,可以怎样读写?
答、通过root用户读写。
776、问stat结构体中,判断是不是普通文件的函数是什么?判断是不是目录文件的函数是什么?还有哪些判断文件类型的函数?
答、S_ISREG(buf.st_mode);
S_ISDIR(buf.st_mode);
S_ISCHR();//字符设备
S_ISDLK();//块设备
S_ISPIPO();//管道文件
S_ISLNK();//符号链接设备
S_ISSOCK();//套接字文件。
其中参数都是buf.st_mode.
而buf.st_mode是结构体中的数据成员。
777、问stat结构体中,buf.st_mode中有保存文件的权限信息(rwx)吗?还保存了什么?
答、有,后9位就是;还保存了文件类型。
778、问获得文件信息的命令?
答、stat file;其中file是文件名。
779、问硬盘里有管道文件吗?
答、没有。
780、问创建管道文件的命令?
答、mkfifo file;file是创建的管道文件名。
781、设备文件放在什么目录下?
答、根目录下的dev。
782、什么是字符设备?
答、鼠标和键盘设备称为字符设备。
783、问什么是符号链接?
答、又称为软链接,符号链接是在当前目录创建另一目录下的文件的链接。文件名一样,
但是实际上这个文件是指向另一目录下的文件。另一个目录下的文件被删除后,
这个链接文件是无效的。
784、问如何进入根目录?
答、cd /
785、如何查看cpu的信息?
答、cat /proc/cpuinfo;
786、根目录下有/proc文件目录,问它在硬盘上吗?/dev呢?
答、不在。是假目录,也不在,是个假目录。
787、问如何查看所有挂载的文件信息?
答、shell命令mount。
788、怎样保证挂载的文件目录和磁盘不会因为系统重启而出现失效?
答、在/etc/fstab中添加语句
/dev/sdb1 /home/lzx/mount-dev-sdb1 ext4 errors=remount-ro 0 1;
即可。
789、问当系统启动时,/etc/profile文件会自动执行?
答、对,如果在里面添加touch aaaxxxxx;重启后就能在桌面看到aaaxxxx文件。
790、问某文件与某磁盘分区挂载,重启后,它们还是挂载状态吗?
答、不是。系统重启后就会消失。
791、问目录中的lost+found文件是用来做什么的?
答、一旦断电,可以通过这个文件找到原来未写入的信息。
792、问拓展分区能不能被格式化?
答、不能。
793、问拓展分区中能不能再划分成主分区或逻辑分区?
答、可以。
794、问拓展分区有什么特点?和主分区之间的关系?
答、且拓展分区只能有一个,但是主分区和逻辑分区可以是多个,一般拓展分区会紧接着主分区开始;
795、问如果在一个目录A下,存在某个目录B挂载的磁盘,正好是用来备份文件的目录挂载的磁盘,
问在A目录下用命令rm -rf删除目录下的所有文件,用来备份文件的目录中文件会发生什么影响?
答、用来备份文件的目录也会被删除。
796、问存在两个目录,它们挂载的磁盘都是相同的,则两个目录中
的文件内容是相同的吗?
答、对,且在任意一个目录中增加新的文件,在另一个目录中也能查看到。
797、问如何实现指定的磁盘分区与指定的文件目录之间挂载?让指定的文件目录下创建的文件
全部存储在指定的磁盘分区中(挂载的作用)?
答、①、创建要挂载的目录,例如mount-dev-sdb1/;②、不进入目录,参考如下命令输入命令:sudo mount
/dev/sdb1 mount-dev-sdb1/;③、测试:先不进入目录,改变目录的权限777;
再进入目录,touch创建文件。
798、问格式化磁盘的命令?
答、sudo mkfs.ext4 /dev/sdb1;
799、给出磁盘分区出主分区的操作过程?
答、视频(day02 10、磁盘管理命令);
①、shell 命令sudo fdisk/dev/sdb;注意如果sdb改为sda会出现格式化操作系统情况,破坏了操作系统;②、输入m查看帮助;③、输入n,进行分区;
④、输入p,开始主分区操作;如果输入的是e,表示分区成拓展分区⑤、
根据提示选择分区的开始号(按512B为一个单位);⑥、根据提示选择
分区的结束号(按512B为一个单位),也可以通过+5G的方式确定;⑦、输入p键;
⑧、输入w键。
800、linux上查看磁盘信息的命令?
答、fdisk。
sudo fdisk -l。
801、给出在ubuntu上为操作系统加快硬盘的方法?
答、①、先关机;②、在设置中,选择设备处的硬盘,再点击添加,按步骤进行下去。
802、问硬盘的读取单位为什么是512Byte?
答、因为硬盘容量一般比较大,往往超过100GByte,而32位计算机系统,按字节最多可以区分4G,
是不同区分硬盘的,为了区分硬盘,选择512Byte作为读取的单位。
803、问shell获得系统配置的命令时什么?
答、getconf;例如getconf -a;对应 sysconf
804、问怎样改变文件中的open files信息的数量?
答、ulimit -n 1000;例如
805、问怎样获得文件的限制信息?
答、ulimit -a;
806、问Linux上读取文件系统配置的函数是什么?
答、sysconf。
807、问文件除了要存储文件本身的数据外,还要存储什么?
答、时间撮,等文件的一些属性
808、给出刷新缓存的函数?它们刷新哪里的缓冲是用户还是内核?怎样刷新用户区的缓存呢?
答、void sync(void);
int syncfs(int fd);
int fsync(int fd);
int fdatasync(int fd);(只刷新文件的data)
内核。
fflush;
809、问如何定义临时文件?
答、int main()
{
char tmp_path[256];
strcpy(tmp_path,"/tmp/save_the_world_xxxxxx");
mkstemp(tmp_path);
printf("%s\n",tmp_path);
}
810、问linux的目录/tmp/任何用户都能写,这句话是对的吗?
答、对。
809、问linux的临时文件目录是什么?
答、/tmp/
810、问如果将811中的int flags=MAP_SHARED改为int flags=MAP_PRIVATE;再添加语句strcpy(ptr,"*****");
编译能不能成功,执行能不能成功,效果如何?
答、能成功,能成功,效果不能实现。
811、给出创建文件映射机制的方法?
答、首先必须用shell命令创建出指定长度的文件,然后
在.c文件中写程序,代码示例如下:
#include"./header.h"
int main()
{
void *addr=NULL;
size_t length=4096;
int prot=PROT_READ|PROT_WRITE;//protect
int flags=MAP_SHARED;
int fd=open("a.txt",O_RDWR);
off_t offset=0;
char *ptr=(char *)mmap(
addr,
length,
prot,
flags,
fd,
offset);
strcpy(ptr,"hello shenzhen");
munmap(ptr,length);
close(fd);
}
创建了a.txt文件作为4096大小的磁盘的文件映射,并被写入"hello shenzhen";
812、问用shell命令给出创建指定长度的文件的命令?
答、truncate a.txt --size=4k;
或dd if=/dev/zero of=a.txt bs=1024 count=4;
813、问在linux中O_RDONLY、O_WRONLY、O_RDWR的预定义常数是什么?
linux中O_APPEND、O_WRITE、O_READ的预定义常数又是设么?
答、#define O_RDONLY 0;
#define O_WRONLY 1;
#define O_RDWR 2;
分别是1、2、4;
814、问利用fcntl函数增加open函数的属性,有哪些限制条件,代码格式是怎样的?
答、对于像O_RDONLY,O_WRONLY,O_RDWR,O_CREAT,O_EXCL,O_NOCTTY,O_TRUNC是不能通过fcntl添加属性的;
但是O_APPEND,O_ASYNC,O_DIRECT,O_NOATIME,O_NONBLOC才可以。
815、问什么是原子操作?
答、原子操作就是不能被破坏的程序执行,注意程序可以是类似加了O_APPEND的write函数一样的程序。
816、linux函数都是通过文件描述符操作内核中的结构体的?
答、正确。
817、问fd2=dup2(fd,5);如果fd2,fd是打开状态,这个程序时运行的吗?是安全的吗?
答、是允许的,是安全的。因为付过fd2,fd所指向的文件是打开的,dup2会关闭该文件,并使得fd2存储文件描述符5,而该文件描述符
指向的文件结构体是由fd变量存储的文件描述符指向的文件结构体拷贝过来的。
818、问fd2=dup2(fd,5),fd2是fd还是5?
答、5。
819、问dup的参数文件描述符和dup函数返回的文件描述符值是不是相同的?
答、不是。
820、int fd=open("a.tmp",O_RDWR);
int fd2=dup(fd);
问fd和fd2相不相同?
答、不相同。
821、问dup的作用?
答、根据文件描述符拷贝将文件描述符指向的文件结构体拷贝到另一个文件描述符指向的文件结构体。
822、问O_EXCL能不能单独使用?
823、使用Linux的系统函数open时,O_TRUNC参数是用来做什么的?
答、如果文件存在,清空文件内容。
822、问在linux上使用int ret=open("a.txt",O_WRONLY);
write(ret,"hello",5);
如果a.txt文件存在,会怎么执行?,如果文件不存在呢?
答、会覆盖原文件中的信息。如果文件不存在会报错。
823、问写文件时使用open函数,采用什么方式,可以避免打开相同的文件时造成写文件发生覆盖问题?
答、添加open函数。
824、问如何转到root用户?
答、首先要保证设置了root权限的密码,可以通过sudo passwd来设置;然后su切换。
825、问open("a.tmp",O_WRONLY|O_CREAT,0777);
创建的文件权限就是0777吗?这段代码还有什么问题?
答、不是,还受目录下的掩码影响。这段代码没有考虑到如果有两个程序同时创建a.tmp文件,会发生错误,因为这是不合理的。
所以必须要在O_CREAT后加上|O_EXCL;这样可以使得创建文件为原子操作。
826、问open(pathname,O_RDONLY|O_WRONLY);其中的|是什么含义?
答、或操作符。
827、问使用open函数时,open(pathname,flags,mode,arg1);
会使用arg1参数吗?
答、不会,最多只用前三个参数。
828、问linux中open函数和creat函数有什么区别?
答、open函数包含了creat函数的功能。
829、问c语言与Qt相比写程序有什么缺点?
答、Qt存在序列化读写文件,而c语言不存在,所以c语言用结构体读写文件比较复杂。
830、文件描述符的本质是?(最准确)
答、内核中存储文件指针的结构体数组的下标。默认时共有1024个结构体。
831、问如何同时打开.cpp或.c文件以及.h文件?
答、:AV;
831、问vim如何切换头文件和.cpp文件或.cp文件?
答、通过:A
832、问如何使用vim生成tag文件?
答、输入vim,进入vim界面,再按键ctrl+p,会退出vim界面,再按enter键进入。退出就能在当前目录找到tags文件。
833、使用vim时怎样进入目录?如何打开目录中的文件
答、ctrl+w+w。跳到目录分屏,再移动光标,按enter键可以打开目录,再按一次enter键会退回,打开目录后移动光标到文件名,再按enter键就能在右边打开文件。
834、vim插件如何使用?
答、按下vim直接可以使用改进的vim,再按ctrl+o;可以通过分屏的方式显示目录(在左边)
835、问什么是文件的上下文?
答、文件的打开模式、文件的位置类型、文件的初始类型等。通过文件标识符可以找到这些信息。
836、问vim中如何分屏?
答、split c。(横向分屏命令)
vsplit c。(竖向分屏命令)
837、linux的vim中如何在两个分屏间切换?
答、ctrl+w+w;先按ctrl键,再按两次w。
838、linux中很多函数和命令是同名的?
答、对。
839、问.表示什么?
答、表示当前目录。
840、问文件的更改和改动的区别?
答、更改是改变内容,改动是改变文件的属性。
841、问什么文件一开机就会启动?
答、/etc/profile.
/etc/fstab(专业的用来挂载配置文件)
842、sudo apt-get install ctags有什么用处?
答、vim插件(vim.tar.gz)在用户home目录解压后输入的启动命令。
843、linux到用户的home目录的命令?
答、cd
844、问fdisk的作用?
答、查看磁盘信息。
845、问硬盘分区的目的?
答、分区是为了隔离,隔离是为了管理。
846、问linux中程序中使用当前目录,采用什么书写方式?
答、./
847、问一个进程打开,0,1,2号文件描述符是什么?
答、不管有没有使用open等打开或读文件函数,0,1,2号文件描述符默认指向标准输入,标准输出,标准错误文件。
848、问printf实际上调用了fwrite函数,fwrite函数实际上调用了write函数,这种说法对不对?
答、对。
849、问缓冲的好处?
答、提高存储效率,
850、问tmp目录任何用户都能写文件?
答、对。
851、word打开文本文件和txt打开文本文件有什么不同点?
答、一个是通过文件映射,另一个不是,所以前者较快。
852、文件映射的好处?文件映射的函数是什么?
答、效率非常高。mmap/munmap;
853、问打开的文件能不能立刻被删除?
答、不能,当文件关闭了才会真正删除,期间只是不让用户看到文件而已。
854、能不能用剪切功能实现复制?
答、可以,剪切后再撤销就能实现复制。
855、什么因素决定了printf函数打印的对象。
答、printf函数(高级语言程序)是向1号文件描述符打印文件,默认1号文件描述符
指向的文件结构体内的文件指针是指向标准输出的。但是如果通过dup操作改变
1号文件描述符内的指针指向,那么printf函数会指向非标准输出文件。
所以决定因素是文件描述符指向的结构体内的文件指针指向。
856、问文件描述符的索引表在哪?存放了什么?
答、在内核,文件描述符。若用户进程有打开文件操作,会拿到文件描述符。
857、进程中有很多文件描述符?
答、说法正确。
858、问文件描述符的类型?
答、整型,范围0-1023。
859、问能不能将很多经常使用的头文件放在同一个head.h头文件中,
这样很明显可以提高编写代码的效率?
答、可以。
860、问如何查看磁盘的文件系统类型?
答、单击右键文件中磁盘,并选择属性,即可查阅出类型。
861、问linux系统接口的函数查找命令?
答、man 2 而不是man。
862、问.tar文件解包命令?.tar.gz文件解压缩命令?
答、tar -xvf a.tar
tar -xzvf a.tar.gz;
863、问read和write函数中什么时候最适合用O_APPEND?
答、写系统日志,能保证不覆盖。
864、问系统调用会不会影响程序执行时间?
答、会。
866、问什么是用户CPU,什么是内核CPU?
答、通俗的说法,指处理用户事务时CPU花费时间和执行内核中程序的CPU花费时间,
867、问int fd_dst=open(dstfilename,o_WRONLY|O_CREAT);
int fd_dst=open(dstfilename,o_WRONLY|O_CREAT,0777);
int fd_dst=open(dstfilename,o_WRONLY|O_CREAT|O_EXCL,0777);
哪种写法正确?
答、第三种。
868、问用lseek函数读写文件,如何知道文件的大小?
答、通过lseek的返回值(设置适当的参数)。
869、问fwrite函数和write函数有什么主要区别?
答、fwrite会在用户空间开辟缓存空间,而且在内核空间也会开辟;
write不会在用户空间开辟,但是会在内核空间开辟。
870、问.gz文件如何解压缩?
答、gzip -d 加文件名
871、linux上命令按tab键有什么作用?
答、可以查找要补齐的文件,特别是apt-get 下载文件时也能通过按tab键查看要下载的文件,
但是必须要先update下载要下载的文件的索引。
872、问系统内核是什么?系统调用是什么?
答、系统内核是存储了所有系统调用的空间,还有缓冲,系统调用主要是
操作系统操作系统的硬件资源的程序。
873、问realpath的作用?
答、可以将相对路径转换为绝对路径。
874、当前目录是指什么?
答、当前的shell程序所在的目录(shell是用来解析命令的程序)。
875、touch作用?
答、创建文件。
876、home目录如何表示?
答、~;home目录是用户账户所在的目录。
877、linux中路径是以什么开始?
答、根目录/
878、从信息角度,说出计算机的作用?
答、保存信息,操作信息,传输信息,展现信息。
879、shell进程作用?
答、提供用户接口,供用户输入命令,shell会解析命令,操作计算机。
880、login进程作用?
答、提供用户接口,供用户登录。执行/etc/.bashrc脚本
881、init程序的作用?
答、linux系统的第一个程序。执行/etc/profile脚本
882、kernel的作用?
答、初始化硬盘。
883、问boot的作用?
答、选择启动的操作系统。
884、问bios的作用是什么?
答、初始化主板,初始化硬盘。
885、什么是linux操作系统发行版?
答、都使用linux内核,但是操作系统软件不同。这样的操作系统叫做发行版。
886、接口。是什么?
答、一种由它方实现自己需求功能的机制
997、应用程序能访问硬件吗?
答、不能,必须通过操作系统访问。
998、ubuntu与linux的关系?
答、是linux的发行版。
999、linux操作系统的功能?
答、主要是数据处理。
1000、计算机系统包括哪两个方面?
答、软件和硬件。
1、问手机格式化以后的文件能够恢复吗?删除以后呢?如何才能将文件删除干净?
答、能,能,只有用大的文件进行覆盖以后才能真正删除原文件。
2、问./a.out < file执行的结果是?
答、将程序运行结果重定向到file。
3、重定向的含义是什么?
答、将文件信息从一处“搬”到另一处。
4、cd -号的作用?
答、回到上次的路径下。
5、如何查看程序的退出值?
答、echo $?
6、映射的含义?
答、一个东西,另一个东西是这个东西的另一种表现形式,对另一个东西操作,
就相当于对这个东西操作。当然可以根据实际情况拓展功能。例如数据库的
外模式(视图)是模式的映射。就像函数的值域是由定义域决定一样,不过
函数的映射是值域与定义域之间的关系,而这里的映射是一种机制。
7、vs的来源是gun的gdb,只是用图形化作了封装而已?
答、是。
8、问linux上如何反撤销?
答、ctrl+r。
9、问如何改变linux控制台黑窗口的背景?
答、 echo -e "\033[44;37;5m ME \033[0m COOL
-----------------------------------------------------------------------------
vim命令
:e filename Open filename for edition
:w Save file
:q Exit Vim
:q! Quit without saving
:x Write file (if changes has been made) and exit
:sav filename Saves file as filename
. Repeats the last change made in normal mode
5. Repeats 5 times the last change made in normal mode
在文件中移动
k or Up Arrow move the cursor up one line
j or Down Arrow move the cursor down one line
e move the cursor to the end of the word
b move the cursor to the begining of the word
0 move the cursor to the begining of the line
G move the cursor to the end of the line
gg move the cursor to the begining of the file
L move the cursor to the end of the file
:59 move cursor to line 59. Replace 59 by the desired line number.
20| move cursor to column 20.
% Move cursor to matching parenthesis
[[ Jump to function start
[{ Jump to block start
剪切、复制和粘贴
117yy,从光标处复制了117行
在命令提示符下输入:56,61y
y Copy the selected text to clipboard
p Paste clipboard contents
dd Cut current line
yy Copy current line
y$ Copy to end of line
D Cut to end of line
搜索
/word Search word from top to bottom
?word Search word from bottom to top
* Search the word under cursor
/\cstring Search STRING or string, case insensitive
/jo[ha]n Search john or joan
/\< the Search the, theatre or then
/the\> Search the or breathe
/\< the\> Search the
/\< ¦.\> Search all words of 4 letters
/\/ Search fred but not alfred or frederick
/fred\|joe Search fred or joe
/\<\d\d\d\d\> Search exactly 4 digits
/^\n\{3} Find 3 empty lines
:bufdo /searchstr/ Search in all open files
bufdo %s/something/somethingelse/g Search something in all the open buffers and replace it with somethingelse
替换
:%s/old/new/g Replace all occurences of old by new in file
:%s/onward/forward/gi Replace onward by forward, case unsensitive
:%s/old/new/gc Replace all occurences with confirmation
:2,35s/old/new/g Replace all occurences between lines 2 and 35
:5,$s/old/new/g Replace all occurences from line 5 to EOF
:%s/^/hello/g Replace the begining of each line by hello
:%s/$/Harry/g Replace the end of each line by Harry
:%s/onward/forward/gi Replace onward by forward, case unsensitive
:%s/ *$//g Delete all white spaces
:g/string/d Delete all lines containing string
:v/string/d Delete all lines containing which didn’t contain string
:s/Bill/Steve/ Replace the first occurence of Bill by Steve in current line
:s/Bill/Steve/g Replace Bill by Steve in current line
:%s/Bill/Steve/g Replace Bill by Steve in all the file
:%s/^M//g Delete DOS carriage returns (^M)
:%s/\r/\r/g Transform DOS carriage returns in returns
:%s#<[^>]\+>##g Delete HTML tags but keeps text
:%s/^\(.*\)\n\1$/\1/ Delete lines which appears twice
Ctrl+a Increment number under the cursor
Ctrl+x Decrement number under cursor
ggVGg? Change text to Rot13
大小写
Vu Lowercase line
VU Uppercase line
g~~ Invert case
vEU Switch word to uppercase
vE~ Modify word case
ggguG Set all text to lowercase
gggUG Set all text to uppercase
:set ignorecase Ignore case in searches
:set smartcase Ignore case in searches excepted if an uppercase letter is used
:%s/\<./\u&/g Sets first letter of each word to uppercase
:%s/\<./\l&/g Sets first letter of each word to lowercase
:%s/.*/\u& Sets first letter of each line to uppercase
:%s/.*/\l& Sets first letter of each line to lowercase
读写文件
:1,10 w outfile Saves lines 1 to 10 in outfile
:1,10 w >> outfile Appends lines 1 to 10 to outfile
:r infile Insert the content of infile
:23r infile Insert the content of infile under line 23
文件浏览器
:e . Open integrated file explorer
:Sex Split window and open integrated file explorer
:Sex! Same as :Sex but split window vertically
:browse e Graphical file explorer
:ls List buffers
:cd .. Move to parent directory
:args List files
:args *.php Open file list
:grep expression *.php Returns a list of .php files contening expression
gf Open file name under cursor
和 Unix 系统交互
:!pwd Execute the pwd unix command, then returns to Vi
!!pwd Execute the pwd unix command and insert output in file
:sh Temporary returns to Unix
$exit Retourns to Vi
对齐
:%!fmt Align all lines
!}fmt Align all lines at the current position
5!!fmt Align the next 5 lines
Tabs/Windows
:tabnew Creates a new tab
gt Show next tab
:tabfirst Show first tab
:tablast Show last tab
:tabm n(position) Rearrange tabs
:tabdo %s/foo/bar/g Execute a command in all tabs
:tab ball Puts all open files in tabs
:new abc.txt Edit abc.txt in new window
分屏显示
:e filename Edit filename in current window
:split filename Split the window and open filename
ctrl-w up arrow Puts cursor in top window
ctrl-w ctrl-w Puts cursor in next window
ctrl-w_ Maximize current window vertically
ctrl-w| Maximize current window horizontally
ctrl-w= Gives the same size to all windows
10 ctrl-w+ Add 10 lines to current window
:vsplit file Split window vertically
:sview file Same as :split in readonly mode
:hide Close current window
:nly Close all windows, excepted current
:b 2 Open #2 in this window
自动完成
Ctrl+n Ctrl+p (in insert mode) Complete word
Ctrl+x Ctrl+l Complete line
:set dictionary=dict Define dict as a dictionnary
Ctrl+x Ctrl+k Complete with dictionnary
Marks
m {a-z} Marks current position as {a-z}
' {a-z} Move to position {a-z}
'' Move to previous position
缩写
:ab mail mail@provider.org Define mail as abbreviation of mail@provider.org
文本缩进
:set autoindent Turn on auto-indent
:set smartindent Turn on intelligent auto-indent
:set shiftwidth=4 Defines 4 spaces as indent size
ctrl-t, ctrl-d Indent/un-indent in insert mode
>> Indent
<< Un-indent
=% Indent the code between parenthesis
1GVG= Indent the whole file
语法高亮
:syntax on Turn on syntax highlighting
:syntax off Turn off syntax highlighting
:set syntax=perl Force syntax highlighting
--------------------------------------------------------------------------------
10、问vim中如何实现折叠功能?
答、①没有在.vimrc中设置set fdm=marker:
直接打开vim
1 :set fdm=marker 在vim中执行该命令
2 5G 将光标跳转到第5行
3 zf10G 折叠第5行到第10行的代码,vim会在折叠的开始和结束自动添加三个连续的花括号作为标记
4 zR 打开所有折叠
5 zM 关闭所有折叠
6 zE 删除所有的折叠标签
7 退出vim窗口再次打开,执行2-6步。依然可以折叠,但是没有标记了。重新打开后折叠信息会丢失。
②在.vimrc中设置了set fdm=marker:
退出窗口再打开折叠不会消失
2 5G 将光标跳转到第5行
3 zf10G 折叠第5行到第10行的代码,vim会在折叠的开始和结束自动添加三个连续的花括号作为标记
4 zR 打开所有折叠 (zo打开光标下的折叠)
5 zM 关闭所有折叠 (zc关闭光标下的折叠)
6 zE 删除所有的折叠标签
11、问vim中如何选中,再折叠?
答、shift +v后再按zf键(不要同时按下)。
12、如何在vim中注释指定行,取消注释呢?
答、注释:首先进入命令行模式,然后移动光标到要批量注释(插入字符)的起始行,然后按下ctrl+v键
(同时按不同时按时可视行模式),进入visual block模式(不是visual 行形式),然后用j、k选中要批量注释的行,
再按一次大写I,最后输入注释符/或要插入的符号。
取消注释:首先静茹命令行模式,然后移动光标到要批量取消注释(消除字符)的起始行的首列,然后按下ctrl+v键,
进入visual block模式,然后使用l键选中要取消的符号的列,再按k,l键进行调整,选中要取消的行,
再按d键,就可以全部删除。
13、问linux如何删除到文件结尾?
答、dG.
14、linux中为了使用typeid().name(),需要包含什么头文件?
答、#include<typeinfo>
15、问linux更新指令?
答sudo apt-get update
16、问linux制作动态库中-fPIC的作用?
答、g++ one.cpp two.cpp three.cpp -fPIC -shared -o libtest.so
-fPIC的全称是file position independent code。表示编译的代码与位置无关。(自做主)
17、问要使ld.so.config中的配置有效,要满足哪些要求?
答、①、gcc或g++编译时,要添上ld.so.config中自己配置的路径。该路径就是动态库.so的路径。而且ltest库名也要加。
②、在ld.so.config中添加动态库所在的路径。(顺序好像写反了)
18、给出生成多个.cpp文件的动态库的方法,以及使用过程?
答、①、g++ one.cpp two.cpp three.cpp -fPIC -shared -o libtest.so(注意头文件可以是一个也可以是多个。流程都一样);
②、修改ld.so.config文件,在其中添加生成的libtest.so文件所在的路径;ldconfig命令加载该配置文件;
③、编译使用该动态库的代码
g++ main.cpp -o main -I/home/lzxice/dynamiclibmulti1 -ltest -L/home/lzxice/dynamiclibmulti1
注意其中-L与刚刚自己添加的动态库路径是一样的。只有这样才能保证ld.so.config中配置的路径生效。
-ltest也要加。-I也必须添加,是动态库的头文件。也是main.cpp中的头文件位置(主要是为main.cpp设置)。
④、使用main程序。
19、服务器不能有中文?
答、对。特别是不能有中文写的目录。
20、问闭包的由来?
答、在函数内定义的函数,在函数中使用这个函数时,可以访问该函数的局部变量。
如果使用的这个函数就是自身,称为闭包。
int add()
{
int count=0;
int plus()
{
count+=1;
}
return plus();
}
int add()
{
int count=0;
return function(){return count+=1};
}
21、问闭包是什么?
答、子函数可以使用父函数的局部变量,还有父函数的参数。
22、在指定行添加两个字符?
答、 sed -i 's/^.*zz.*/--&/g' testabc.lua
23、问压缩文件的好处?
答、网络传输文件更快,效率高。
24、问gzip命令如何使文件具有最佳的压缩比?
答、gzip -9 -c man.config >hello.gz
25、问如何将某个文件夹下包含某个字符串的文件移动到另一个文件夹?
答、find . -name "*.ai" -exec mv {} /data1/test/test \;
26、declare -i date_dem=`date --date="$date2" + %s`;问哪里有错?
答、应该是+%s。
27、尽可能延后变量定义式的出现。
28、vim突然卡死(阿里云服务器)如何解决?
答、使用vim时,如果你不小心按了 Ctrl + s后,你会发现不能输入任何东西
了,像死掉了一般,其实vim并没有死掉,这时vim只是停止向终端输出而已,
要想退出这种状态,只需按Ctrl + q 即可恢复正常。
29、vpn正向代理,nginx有反向代理?
答、对。
30、vpn的机制?
答·、修改包的来源为其它国家,修改包的去向为其它国家。
31、服务器并发量的多少与内存有关?
答、对。
32、查看占用端口号的进程?
答、sudo lsof -i:80
33、问分布式一般采用什么类型的数据库?
答、nosql。偏向于内存数据库,性能更高。但为了防止数据丢失,也会结合采sql数据库存储。
34、nginx可以搭建email服务器吗?
答、可以。
35、统计目录下所有指定类型文件的行数?
答、wc *.c -l;
36、如何查找某个目录下所有文件包括子文件夹包含指定字符串的所有行。
答、grep "main" . -r --color
37、linux上按时间排序文件?
答、ls -lrt
38、firefox造成linux系统很卡。
39、linux上如何查找某目录下文件名中包含某段字符串的文件个数?
答、find . -name "*gif*" | wc -l
40、linux查看磁盘空间?
答、df -h
41、能不能在线程中开辟线程?
答、可以。
42、问linux socket系统调用listen第二个参数的含义,该系统调用的作用?
答、表示能监听的最大并发量。系统调用监听与服务器完成三次握手的socket,
等待被accept系统提取。listen阶段开始进行tcp的三次握手。
43、进程是如何得知信号要被处理?
答、通过检查PCB中的信号标记。
44、epoll使用了mmap?
答、对。
45、linux如何查看某个进程对应的端口号?
答、netstat -anp | grep "abc";
46、linux打印ps aux 第二列结果?
答、ps aux | grep "phan" | awk '{print $2}';
47、shell命令查看一个程序的系统调用?
答、strace 进程名
48、如何判断一个api是不是系统函数?
答、是否访问内核数据结构;是否访问外部硬件资源。二者有一为系统函数。
49、进程的内核区存储进程pcb?
答、正确。
50、简述ls | wc –l命令的原理?
答、ls和wc是父子进程的关系,ls命令正常会将结果集写出到stdout,但现在会写入管道的写端;wc –l
正常应该从stdin读取数据,但此时会从管道的读端读。
51、问管道的局限性?
答、
管道的局限性:
① 数据不能进程自己写,自己读。
② 管道中数据不可反复读取。一旦读走,管道中不再存在。
③ 采用半双工通信方式,数据只能在单方向上流动。
④ 只能在有公共祖先的进程间使用管道。
52、问管道的优劣?
答、
优点:简单,相比信号,套接字实现进程间通信,简单很多。
缺点:1. 只能单向通信,双向通信需建立两个管道。
2. 只能用于父子、兄弟进程(有共同祖先)间通信。该问题后来使用fifo有名管道解决。
53、问FIFO是什么?
答、命名管道。以区分管道(pipe)。管道(pipe)只能用于“有血缘关系”的进程间。但通过FIFO,
不相关的进程也能交换数据。
54、问什么是存储映射I/O?
答、
存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中
取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件。
这样,就可在不适用read和write函数的情况下,使用地址(指针)完成I/O操作。使用这种方法,首先
应通知内核,将一个指定文件映射到存储区域中。这个映射工作可以通过mmap函数来实现。
55、问mmap函数使用要注意什么?作用是什么?
答、调用munmap,作用是将进程的某段内存与某块磁盘区域相映射。
56、问如何理解信号是软件层面的中断?
答、通过在进程的pcb中设置与信号相关的标志,进程执行该标志对应的中断处理程序。
57、什么叫信号递达到进程?
答、递送并且到达进程,该进程检查pcb中对应的信号标记后。
58、问select和epoll的区别?
答、select有如下缺点:
1)每次调用 select(),都需要把 fd 集合从用户态拷贝到内核态,这个开销在 fd 很多时会很大,
同时每次调用 select() 都需要在内核遍历传递进来的所有 fd,这个开销在 fd 很多时也很大。
2)单个进程能够监视的文件描述符的数量存在最大限制,在 Linux 上一般为 1024,可以通过修改
宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。
解决一个程序只能有一个阻塞点的问题。
epoll:
1)监视的描述符数量不受限制,它所支持的 FD 上限是最大可以打开文件的数目,这个数字一般远大于 2048,举个例子,
在 1GB 内存的机器上大约是 10 万左右,具体数目可以 cat /proc/sys/fs/file-max 察看,一般来说这个数目和系统内存关系很大。
select() 的最大缺点就是进程打开的 fd 是有数量限制的。这对于连接数量比较大的服务器来说根本不能满足。虽然也可以选择多进程
的解决方案( Apache 就是这样实现的),不过虽然 Linux 上面创建进程的代价比较小,但仍旧是不可忽视的,加上进程间数据同步远比
不上线程间同步的高效,所以也不是一种完美的方案。
2)I/O 的效率不会随着监视 fd 的数量的增长而下降。select(),poll() 实现需要自己不断轮询所有 fd 集合,直到设备就绪,
期间可能要睡眠和唤醒多次交替。而 epoll 其实也需要调用 epoll_wait() 不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,
但是它是设备就绪时,调用回调函数,把就绪 fd 放入就绪链表中,并唤醒在 epoll_wait() 中进入睡眠的进程。虽然都要睡眠和交替,
但是 select() 和 poll() 在“醒着”的时候要遍历整个 fd 集合,而 epoll 在“醒着”的时候只要判断一下就绪链表是否为空就行了,
这节省了大量的 CPU 时间。这就是回调机制带来的性能提升。
3)select(),poll() 每次调用都要把 fd 集合从用户态往内核态拷贝一次,而 epoll 只要一次拷贝,这也能节省不少的开销。
59、问i/o多路复用解决的是什么问题?
答、解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用。
60、给出select使用的api?
答、fd_set rfds;
FD_ZERO(&rfds);
FD_SET(0, &rfds);
FD_SET(fd, &rfds);
select(FD_SETSIZE, &rfds, NULL, NULL, NULL);
if( FD_ISSET(0, &rfds) )
if( FD_ISSET(fd, &rfds) )
61、给出epoll使用的api?
答、int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
62、epoll和select的对比?
答、
select缺点:
最大并发数限制:使用32个整数的32位,即32*32=1024来标识fd,虽然可修改,但是有以下第二点的瓶颈;
效率低:每次都会线性扫描整个fd_set,集合越大速度越慢;
内核/用户空间内存拷贝问题。
epoll的提升:
本身没有最大并发连接的限制,仅受系统中进程能打开的最大文件数目限制;
效率提升:只有活跃的socket才会主动的去调用callback函数;
省去不必要的内存拷贝:epoll通过内核与用户空间mmap同一块内存实现。
当然,以上的优缺点仅仅是特定场景下的情况:高并发,且任一时间只有少数socket是活跃的。
如果在并发量低,socket都比较活跃的情况下,select就不见得比epoll慢了(就像我们常常说快排比
插入排序快,但是在特定情况下这并不成立)。
63、问epoll_create,函数调用时,内核做了哪些事情?
答、内核帮我们在epoll文件系统里建了个file结点;
在内核cache里建了个红黑树用于存储以后epoll_ctl传来的socket;
建立一个list链表,用于存储准备就绪的事件。
64、问epoll_ctl时,程序做了哪些事情?
答、把socket放到epoll文件系统里file对象对应的红黑树上;
给内核中断处理程序注册一个回调函数,告诉内核,如果这个句柄的中断到了,
就把它放到准备就绪list链表里。
65、问epoll_wait时,程序做了哪些事情?
答、
观察list链表里有没有数据。有数据就返回,没有数据就sleep,等到timeout时间到
后即使链表没数据也返回。而且,通常情况下即使我们要监控百万计的句柄,大多一次
也只返回很少量的准备就绪句柄而已,所以,epoll_wait仅需要从内核态copy少量的句
柄到用户态而已。
66、问调用select函数时,发生了什么事情?注意select之前已经将所有的要监听的文件描述符放入了fd中。
答、
从用户空间拷贝fd_set到内核空间;
注册回调函数__pollwait;
遍历所有fd,对全部指定设备做一次poll(这里的poll是一个文件操作,它有两个参数,一个是文件fd本身,
一个是当设备尚未就绪时调用的回调函数__pollwait,这个函数把设备自己特有的等待队列传给内核,让内
核把当前的进程挂载到其中);
当设备就绪时,设备就会唤醒在自己特有等待队列中的【所有】节点,于是当前进程就获取到了完成的信号。
poll文件操作返回的是一组标准的掩码,其中的各个位指示当前的不同的就绪状态(全0为没有任何事件触发),
根据mask可对fd_set赋值;
如果所有设备返回的掩码都没有显示任何的事件触发,就去掉回调函数的函数指针,进入有限时的睡眠状态,
再恢复和不断做poll,再作有限时的睡眠,直到其中一个设备有事件触发为止。
只要有事件触发,系统调用返回,将fd_set从内核空间拷贝到用户空间,回到用户态,用户就可以对相
关的fd作进一步的读或者写操作了。
67、问linux上如何解压bz文件?
答、bunzip2 file.bz;
68、问linux上date命令的作用?
答、输出系统时间。
69、问linux上如何统计程序的运行时间?
答、time ./hello.
70、问gcc -o1、-o2、-o3的作用?
答、优化编译或优化代码执行速度。
71、linux上apt-get 安装的lib的位置?
答、/usr/local/lib/;/usr/lib;
72、ctags为系统目录生成tags?
答、ctags -I __THROW --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --fields=+S -R -f ~/.vim/systags /usr/include /usr/local/include
73、linux根据文件名快速查找包含某个字符的文件?
答、locate iostream.