获取文件名
opendir
头文件: #include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
返回值
The opendir() and fdopendir() functions return a pointer to the directory stream. On error, NULL is returned, and errno is set appropriately.
readdir
头文件:#include <sys/types.h>
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
返回值:成功则返回下个目录进入点. 有错误发生或读取到目录文件尾则返回NULL.
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
int main(int argc , char* argv[])
{
DIR * dir;
struct dirent * ptr;
int i;
dir = opendir("/etc");
while((ptr = readdir(dir)) != NULL)
{
printf("d_name : %s\n", ptr->d_name);
}
closedir(dir);
return 0;
}
执行结果
d_name : .
d_name : ..
d_name : login.defs
d_name : .pwd.lock
d_name : network
d_name : selinux
d_name : ubuntu-advantage
d_name : deluser.conf
d_name : alsa
读写函数
int recv(int sockfd,void *buf,int len,int flags)
int send(int sockfd,void *buf,int len,int flags)
这两个函数和read,write函数非常相似,只是多了一个参数,当最后一个参数为零时二者等同。
最后一个参数有以下几个:
| MSG_DONTROUTE | 不查找表 |
| MSG_OOB | 接受或者发送带外数据 |
| MSG_PEEK | 查看数据,并不从系统缓冲区移走数据 |
| MSG_WAITALL | 等待所有数据 |
————————————————————————————————————————
MSG_DONTROUTE:是send函数使用的标志.这个标志告诉IP.目的主机在本地网络上面,没有必要查找表.这个标志一般用网络诊断和路由程序里面.
MSG_OOB:表示可以接收和发送带外的数据.关于带外数据我们以后会解释的.
MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清除系统缓冲区的内容.这样下次读的时候,仍然是一样的内容.一般在有多个进程读写数据时可以使用这个标志.
MSG_WAITALL是recv函数的使用标志,表示等到所有的信息到达时才返回.使用这个 标志的时候recv回一直阻塞,直到指定的条件满足,或者是发生了错误. 1)当读到了指定的字节时,函数正常返回.返回值等于len 2)当读到了文件的结尾时,函数正常返回.返回值小于len 3)当操作发生错误时,返回-1,且设置错误为相应的错误号(errno)
memset()
函数原型是extern void *memset(void *buffer, int c, int count)
buffer:为指针或是数组,
c:是赋给buffer的值,
count:是buffer的长度.
这个函数在socket中多用于清空数组.如:原型是memset(buffer, 0, sizeof(buffer))
Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
例:char a[100];memset(a, '/0', sizeof(a));
void bzero(void *s, int n); //此函数也有此功能
例: struct sockaddr_in serveraddr;
bzero(&serveraddr,sizeof(serveraddr));
showdown
shutdown关闭部分全双工传输
#include <sys i socket.h>
int shutdown (int sockfd, int howto) ;
sockfd :套接字描述符
how :关闭的方式
SHUT_RD 0
SHUT_WR 1sHUT_RDWR 2
向一个写端已经关闭的套接字写数据,内核会给进程发送STGPIPE信号,接收方的读端立刻返回0从一个读端己经关闭的套接字读数据,read会立刻返回
接受:
read, recv. recvfrom , recvmsg
发送:
vrite, send, sendto , sendmsg
TCP:
read, recv , recvfrom , reacvmsg
write, send,sendto , sendmsg
udp :
recvfrom.recvmsg
sendto, sendnsg
(3)信号驱动工/o模型(udp)部署信号处理函数
step l: signal( sIGIO, signal_handler) ;
step 2: fcntl(fd,F_SETOWN,getpid () );//设置接受sIGTo信号的进程
step 3: flag = fcntl(fd, F_GETFL)//先获取文件标志
step 4: flag = flag l o_AsYNC; //将o_AsYNC标志加入flag
step 5: fcntl (fd, F_SETFL, flag) ://设置文件标志
优点:优化了等待I/O就绪阶段(异步)
缺点:数据搬运阶段没有优化
lsof (list dpen file)列举出当前系统所打开的文件
(1)lsof会访问内核打开的各种文件所以需要root用户身份去运行
sudo lsof
(2) lsof -p <pid>显示指定进程打开的文件
(3) lsof filename显示指定文件在哪些进程中被打开
(4)lsof -d fd显示所有文件描述符是fd的进程
lsof -d 5
( 5 ) lsof -i:端口号
lsof -i TCP
lsof -i ip地址
(6)当内存中还有进程打开你意外删除的文件的时候,可以使用lsof恢复
lsof l grep filename //查看打开这个文件的进程
cd /proc/ 4068/fd //切换到/ proc文件系统
cat fd > filename //将删除的文件从内存倒回磁盘cwd
current working directory;
Lnn library references(AIX) ;
err FD information error isee NAME column) ;
jld jail directory (FreeBSD) ;
ltx shared library text (code and data) ;
Mxx hex memory-mapped type nurmber xx.
m86 Dos Merge mapped file;
mem memory-mapped file;
rmmap memory-mapped device;
pd parent directory;
rtd root directory;
tr kernel trace file iopenBSD) ;
txt program text icode and data) ;
v86 VP/ix mapped file;