1.文件的输入输出
1.open(函数)
#include <sys/types.h>
#include <sys/stat.h>
int open(const char *pathname, int flags);
int open(const char *pathname,int flags,mode_t mode);
pathname是要打开或创建的含路径的文件名,第二个参数flags表示打开文件的方式。
O_RDONLY:以只读方式打开文件。
O_WRONLY:以只写方式打开文件。
O_RDWR:以可读可写的方式打开文件。
这三种打开方式是互斥的。
O_CREAT:若文件不存在则自动建立该文件,只有在此时,才需要用到第三个参数mode,以说明新文件的存取权限。
O_EXCL:如果O_CREAT也没设置,此指令会去检查文件是否存在。文件不存在则创建文件,文件存在则导致打开文件错误。
O_TRUNC:若文件存在并且以可写的方式打开时,此标志将文件长度清为零,即数据丢失,文件属性不变。
O_APPEND:所写入的数据会以追加的方式加入到文件后面。
O_SYNC:以同步的方式打开文件,任何对文件的修改都会阻塞直到物理磁盘上的数据同步以后才返回。
2.close函数
#include <unistd.h>
int close(int fd)
close函数只有一个参数,此参数表示需要关闭的文件的文件描述符,该文件描述符是由open函数或creat函数得到的。当close调用成功时,返回值为0,发生错误时返回-1并设置错误代码。
(注意:close函数调用成功时并不保证数据能全部写回硬盘)
2.文件的读写
1.read函数
#include <unistd.h>
ssize_t read(int fd,void *buf,size_t count);
各参数含义:从文件描述符fd所指向的文件中读取count个字节的数据到buf所指向的缓存中。若参数count为0,则read()不会读取数据,只返回0.返回值实际是读取的字节值。
2.write函数
#include <unistd.h>
ssize_t write(int fd,const void *buf,size_t count);
各参数含义:将buf所指向的缓存区中的count个字节数据写入到由文件描述符fd所指示的文件中。如果调用成功,write()会返回写入的字节数。当错误发生时则返回-1,错误代码存入errno中。
dup和dup2函数
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd,int newfd);
dup用来复制参数oldfd所指的文件描述符。当复制成功时,返回最小的尚未被使用的文件描述符。若有错误则返回-1,错误代码存入errno中。返回的新文件描述符和参数oldfd指向同一个文件,共享所有的锁定,读写指针和各项权限或标志位。
dup和dup2的区别是dup2可以用参数newfd指定新文件描述符的数值。dup2调用成功,返回新的描述符,出错返回-1.
fcntl函数
fcntl系统调用可以用来对已打开的文件描述符进行各种控制操作以改变文件的各种属性。
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd,int cmd);
int fcntl(int fd,int cmd,long arg);
int fcntl(int fd,int cmd,struct flock *lock);
fcntl的功能依据cmd值的不同而不同,具体有一下几种功能。
(1)F_DUPFD
此时,fcntl的功能与dup一样,可以复制由fd指向的文件描述符。调用成功返回新的文件描述符,失败返回-1,错误代码存入errno中。
(2)F_GETFD
此时,fcntl用来获取文件描述符的close-on-exec标志。
(3)F_SETFD
此时,fcntl用来设置文件描述符的close-on-exec标志为第三个参数arg的最后以为。
(4)F_GETFL
此时,fcntl用来获得文件的打开方式。成功返回标志值,失败回-1。
(5)F_SETFL
此时,fcntl用来设置文件打开的方式为第三个参数arg指定的方式。
ioctl函数
ioctl系统调用通常用来控制设备。
#include <sys/ioctl.h>
int ioctl(int fd,int request ,...);
用ioctl获取网络设备的信息
#include<stdio.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<net/if.h>
#include<stdlib.h>
#include<string.h>
unsigned char g_eth_name[16];
unsigned char g_macaddr[6];
unsigned int g_subnetmask;
unsigned int g_ipaddr;
unsigned int g_broadcast_ipaddr;
//reset net
void init_net(void)
{
int i;
int sock;
struct sockaddr_in sin;
struct ifreq ifr;
sock = socket(AF_INET , SOCK_DGRAM, 0);
if(sock == -1)
perror("socket");
strcpy(g_eth_name,"eth0");
strcpy(ifr.ifr_name,g_eth_name);
printf("eth name:\t%s\n",g_eth_name);
//get netid
if(ioctl(sock , SIOCGIFHWADDR ,&ifr)<0)
perror("ioctl");
memcpy(g_macaddr, ifr.ifr_hwaddr.sa_data, 6);
printf("local mac:\t");
for(i=0;i<5;i++)
{
printf("%.2x", g_macaddr[i]);
}
printf("%.2x\n",g_macaddr[i]);
//ip id
if(ioctl(sock, SIOCGIFADDR,&ifr)<0)
{
perror("ioctl");
}
memcpy(&sin , &ifr.ifr_addr ,sizeof(sin));
g_ipaddr = sin.sin_addr.s_addr;
printf("local eth0:\t%s\n", inet_ntoa(sin.sin_addr));
//broadcast id
if(ioctl(sock, SIOCGIFBRDADDR,&ifr)<0)
perror("ioctl");
memcpy(&sin , &ifr.ifr_addr,sizeof(sin));
g_broadcast_ipaddr = sin.sin_addr.s_addr;
printf("broadcast:\t%s\n", inet_ntoa(sin.sin_addr));
//get subnetmask id
if(ioctl(sock,SIOCGIFNETMASK,&ifr)<0)
{
perror("ioctl");
}
memcpy(&sin,&ifr.ifr_addr,sizeof(sin));
g_subnetmask = sin.sin_addr.s_addr;
printf("subnetmaskk:\t%s\n",inet_ntoa(sin.sin_addr));
close(sock);
}
int main(void)
{
//initialize..
init_net();
//do something)
return 0;
}
程序先创建了一个用于网络通信的套接字,然后利用ioctl对其操作,获取网络信息。