『壹』 close(sockfd);
In function `main':client.c:(.text+0x22e): undefined reference to `cloes'编译结果中已经说了无法找到‘cloes’的定义,而且是在编译client.c文件时出的错,你可以打开client.c文件,查找‘cloes’,看看是否有明确定义,或者应该是‘close’而不是‘cloes’希望对你有帮助!
『贰』 linux用什么标识,描述和控制文件
Linux的文件标识符,和Windows的就是文件名不同,它相当于文件的一个指针。在linux的C语言中,除了用通用的《【C】文件读写问题》(点击打开链)中介绍过的fopen等c语言通用操作文件以外,其Linux应用请参考《【Linux】利用C语言文件流复制单一文件),还能用文件标识符还来操作文件。这也是Linux中C语言,最底层,最原始控制文件的方式,其函数open,read,write,close已经完美地表明这一点。同时,在Linux无论是文件、设备和管道,甚至是个可操作对象对可以视作文件来对待,具体表现为都可以用这个文件标识符来操作他们。文件标识符非常独特,并不是指针,其变量类型就是大家非常常用的int。至于这个东西怎么用,具体请看如下文件读写程序:#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>//文件控制#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAXSIZE 512//缓冲区的大小const char* FILEPATH="/tmp/file.txt";//文件目录int main(void) { int fd;//文件标识符, char *s = "被折腾的文字"; char buffer[MAXSIZE+1];//用来接字符的缓冲区int size;//读入的文件长度 if((fd=open(FILEPATH,O_CREAT|O_TRUNC|O_RDWR,0777))<0){//O_CREAT如果指定文件不存在,则创建这个文件,O_EXCL如果要创建的文件已存在,则返回 -1,并且修改 errno 的值//O_APPEND每次写操作都写入文件的末尾,O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容//O_RDONLY只读模式,O_WRONLY只写模式,O_RDWR读写模式//0777为最高权限 perror("打开文件失败!"); exit(1); } if((write(fd,s,strlen(s)))<0){ perror("写入文件失败!"); exit(1); } //lseek(fd,0,SEEK_SET);//即把文件指针移至buf文件的开始处 lseek(fd,-strlen(s),SEEK_END);//即把文件指针往从结尾处向前移动strlen(s)个字符 if((size=read(fd,buffer,MAXSIZE))<0){ perror("读入文件失败!"); exit(1); }else{ buffer[size]='\0';//字符串数组封口 printf("%s\n",buffer); } if(close(fd)<0) { perror("关键文件失败!"); exit(1); } unlink(FILEPATH);//删除文件 exit(0);}这个程序的一大堆头文件,是没办法的,因为所用到的函数需要的基本头文件就是这么多,但这些头文件都是Linux的基本头文件,能够拿来直接用。程序首先打开并同时利用open的参数创建一个文件,之后向这个文件,通过read函数写入一个名为“缓冲区”buffer的字符数组,也就是字符串string的一些东西,然后,写入完毕,因为文件操作光标将会移到文件最后,所以我们要先将其移回文件头,再利用write函数读入这个文件的内容到buffer,并打印到屏幕,最后再用close关闭文件标识符与文件的连接,并利用unlink删除这个文件,如果没有close,unlink将不起作用,因为这个程序正在占用这个/tmp/file.txt,无法删除,如果要强制删除可以考虑remove函数。所以,上述代码的运行结果如下图:最后,这个文件自然是要被删除的了,肯定是没有的:上述程序很简单,但我们更多应该关注这里文件标识符的作用。fd这个int就是文件标识符,相当于FILE *的作用,但他就是一个int。实质上,这个int非常独特,同open函数,int fd里面存着要被操作文件的地址,但它却又不是int *,之后的write和read函数都要根据这个fd所指明的方向来,你可以发现write,read参数都有一个地方,填入了fd,可要求填入的,却是一个int变量,这在windows里面是没有的,同时不了解文件标识符的人,看到write和read的使用可能是云里雾里的,之后的close就更不用说了,就是清楚这个fd与被操作文件的关联关系。unlink函数则和文件标识符无关,需要一个文件路径的参数。
『叁』 linux c语言如何快速知道函数的头文件
1、要用到unistd.h头文件。
2、Write函数用法:write函数所在的头文件为 <unistd.h>write有两种用法。一种是:ssize_twrite(int handle, void *buf, int nbyte);handle 是文件描述符;buf是指定的缓冲区,即指针,指向一段内存单元;nbyte是要写入文件指定的字节数;返回值:写入文档的字节数(成功);-1(出错)write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.另一种是:write(const char* str,int n)str是字符指针或字符数组,用来存放一个字符串。n是int型数,它用来表示输出显示字符串中字符的个数。write("string",strlen("string");表示输出字符串常量3、程序示例:
#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<sysstat.h>#include<io.h>#include<string.h>intmain(void){int*handle;charstring[40];intlength,res;/*Createafilenamed"TEST.$$$".If"TEST.$$$"alreadyexists,itwillbeoverwritten.*/if((handle=open("TEST.$$$",O_WRONLY|O_CREAT|O_TRUNC,S_IREAD|S_IWRITE))==-1){printf("Erroropeningfile.");exit(1);}strcpy(string,"Hello,world!");length=strlen(string);if((res=write(handle,string,length))!=length){printf("Errorwritingtothefile.");exit(1);}printf("Wrote%dbytestothefile.",res);close(handle);return0;}
『肆』 socket编程在windows和linux下的区别
下面大概分几个方面进行罗列:Linux要包含[cpp]#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <arpa/inet.h>等头文件,而windows下则是包含[cpp]#include <winsock.h>。Linux中socket为整形,Windows中为一个SOCKET。Linux中关闭socket为close,Windows中为closesocket。Linux中有变量socklen_t,Windows中直接为int。因为linux中的socket与普通的fd一样,所以可以在TCP的socket中,发送与接收数据时,直接使用read和write。而windows只能使用recv和send。设置socet选项,比如设置socket为非阻塞的。Linux下为[cpp]flag = fcntl (fd, F_GETFL);fcntl (fd, F_SETFL, flag | O_NONBLOCK);,Windows下为[cpp]flag = 1;ioctlsocket (fd, FIONBIO, (unsigned long *) &flag);。当非阻塞socket的TCP连接正在进行时,Linux的错误号为EINPROGRESS,Windows的错误号为WSAEWOULDBLOCK。fileLinux下面,文件换行是"\n",而windows下面是"\r\n"。Linux下面,目录分隔符是"/",而windows下面是"\"。Linux与Windows下面,均可以使用stat调用来查询文件信息。但是,Linux只支持2G大小,而Windows只支持4G大小。为了支持更大的文件查询,可以在Linux环境下加_FILE_OFFSET_BITS=64定义,在Windows下面使用_stat64调用,入参为struct __stat64。Linux中可根据stat的st_mode判断文件类型,有S_ISREG、S_ISDIR等宏。Windows中没有,需要自己定义相应的宏,如[cpp]#define S_ISREG(m) (((m) & 0170000) == (0100000))#define S_ISDIR(m) (((m) & 0170000) == (0040000))Linux中删除文件是unlink,Windows中为DeleteFile。timeLinux中,time_t结构是长整形。而windows中,time_t结构是64位的整形。如果要在windows始time_t为32位无符号整形,可以加宏定义,_USE_32BIT_TIME_T。Linux中,sleep的单位为秒。Windows中,Sleep的单位为毫秒。即,Linux下sleep (1),在Windows环境下则需要Sleep (1000)。Windows中的timecmp宏,不支持大于等于或者小于等于。Windows中没有struct timeval结构的加减宏可以使用,需要手动定义:[cpp]#define MICROSECONDS (1000 * 1000)#define timeradd(t1, t2, t3) do { \(t3)->tv_sec = (t1)->tv_sec + (t2)->tv_sec; \(t3)->tv_usec = (t1)->tv_usec + (t2)->tv_usec % MICROSECONDS; \if ((t1)->tv_usec + (t2)->tv_usec > MICROSECONDS) (t3)->tv_sec ++; \} while (0)#define timersub(t1, t2, t3) do { \(t3)->tv_sec = (t1)->tv_sec – (t2)->tv_sec; \(t3)->tv_usec = (t1)->tv_usec – (t2)->tv_usec; \if ((t1)->tv_usec – (t2)->tv_usec < 0) (t3)->tv_usec –, (t3)->tv_usec += MICROSECONDS; \} while (0)调用进程Linux下可以直接使用system来调用外部程序。Windows最好使用WinExec,因为WinExec可以支持是打开还是隐藏程序窗口。用WinExec的第二个入参指明,如SW_SHOW/SW_HIDE。杂项Linux为srandom和random函数,Windows为srand和rand函数。Linux为snprintf,Windows为_snprintf。同理,Linux中的strcasecmp,Windows为_stricmp。错误处理Linux下面,通常使用全局变量errno来表示函数执行的错误号。Windows下要使用GetLastError ()调用来取得。Linux环境下仅有的这些函数或者宏,Windows中完全没有,需要用户手动实现。atoll[cpp]long longatoll (const char *p){int minus = 0;long long value = 0;if (*p == '-'){minus ++;p ++;}while (*p >= '0' && *p <= '9'){value *= 10;value += *p – '0';p ++;}return minus ? 0 – value : value;}gettimeofday[cpp]#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)#define EPOCHFILETIME 11644473600000000Ui64#else#define EPOCHFILETIME 11644473600000000ULL#endifstruct timezone{int tz_minuteswest;int tz_dsttime;};intgettimeofday (struct timeval *tv, struct timezone *tz){FILETIME ft;LARGE_INTEGER li;__int64 t;static int tzflag;if (tv){GetSystemTimeAsFileTime (&ft);li.LowPart = ft.dwLowDateTime;li.HighPart = ft.dwHighDateTime;t = li.QuadPart; /* In 100-nanosecond intervals */t -= EPOCHFILETIME; /* Offset to the Epoch time */t /= 10; /* In microseconds */tv->tv_sec = (long) (t / 1000000);tv->tv_usec = (long) (t % 1000000);}if (tz){if (!tzflag){_tzset ();tzflag++;}tz->tz_minuteswest = _timezone / 60;tz->tz_dsttime = _daylight;}return 0;}编译相关当前函数,Linux用__FUNCTION__表示,Windows用__func__表示。——————————————————————————–Socket 编程 windows到Linux代码移植遇到的问题1)头文件windows下winsock.h/winsock2.hlinux下sys/socket.h错误处理:errno.h2)初始化windows下需要用WSAStartuplinux下不需要3)关闭socketwindows下closesocket(…)linux下close(…)4)类型windows下SOCKETlinux下int如我用到的一些宏:#ifdef WIN32typedef int socklen_t;typedef int ssize_t;#endif#ifdef __LINUX__typedef int SOCKET;typedef unsigned char BYTE;typedef unsigned long DWORD;#define FALSE 0#define SOCKET_ERROR (-1)#endif5)获取错误码windows下getlasterror()/WSAGetLastError()linux下errno变量6)设置非阻塞windows下ioctlsocket()linux下fcntl() <fcntl.h>7)send函数最后一个参数windows下一般设置为0linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可 能会导致程序退出。8)毫秒级时间获取windows下GetTickCount()linux下gettimeofday()3、多线程多线程: (win)process.h –〉(linux)pthread.h_beginthread –> pthread_create_endthread –> pthread_exit—————————————————————–windows与linux平台使用的socket均继承自Berkeley socket(rfc3493),他们都支持select I/O模型,均支持使用getaddrinfo与getnameinfo实现协议无关编程。但存在细微差别,主要有:头文件及类库。windows使用winsock2.h(需要在windows.h前包含),并要链接库ws2_32.lib;linux使用netinet/in.h, netdb.h等。windows下在使用socket之前与之后要分别使用WSAStartup与WSAClean。关闭socket,windows使用closesocket,linux使用close。send*与recv*函数参数之socket长度的类型,windows为int,linux为socklen_t,可预编译指令中处理这一差异,当平台为windows时#define socklen_t unsigned int。select函数第一个参数,windows忽略该参数,linux下该参数表示集合中socket的上限值,一般设为sockfd(需select的socket) + 1。windows下socket函数返回值类型为SOCKET(unsigned int),其中发生错误时返回INVALID_SOCKET(0),linux下socket函数返回值类型int, 发生错误时返回-1。另外,如果绑定本机回环地址,windows下sendto函数可以通过,linux下sendto回报错:errno=22, Invalid arguement。一般情况下均绑定通配地址。转载jlins
『伍』 linux 怎么查看tomcat日志是否正常
1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h 错误处理:errno.h2)初始化 windows下需要用WSAStartupWSADATA wsaData; err = WSAStartup(0x202,&wsaData); if ( err != 0 ) { return 0; } else if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) //检测是否支持这个版本的socket { WSACleanup( ); return 0; }对应的退出清理用WSACleanup( );linux下不需要3)关闭socket windows下closesocket(…) linux下close(…)4)socket类型 windows下SOCKET linux下int5)获取错误码 windows下WSAGetLastError()linux下errno变量extern int errno;int geterror(){return errno;}6)设置非阻塞 windows下ioctlsocket(server_socket,FIONBIO,&ul); int ul = 1linux下fcntl(server_socket,F_SETFL, O_NONBLOCK); <fcntl.h>7)send函数最后一个参数 windows下一般设置为0 linux下必须是后几个参数用到的socket中,值最大的数(整型)加1 (另一种说法是设置为MSG_NOSIGNAL)
『陆』 socket编程在windows和linux下的区别是什么
1.头文件windows下winsock.h或winsock2.hlinux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在in.h里已经包含了,可以省了)2.初始化windows下需要用WSAStartup启动Ws2_32.lib,并且要用#pragmacomment(lib,"Ws2_32")来告知编译器链接该lib。linux下不需要3.关闭socketwindows下closesocket(…)linux下close(…)4.类型windows下SOCKETlinux下int5.获取错误码windows下getlasterror()/WSAGetLastError()linux下,未能成功执行的socket操作会返回-1;如果包含了errno.h,就会设置errno变量6.设置非阻塞windows下ioctlsocket()linux下fcntl(),需要头文件fcntl.h7.send函数最后一个参数windows下一般设置为0linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可能会导致程序退出8.毫秒级时间获取windows下GetTickCount()linux下gettimeofday()
『柒』 linux close命令
你是指C语言的库函数 close 吧? 它是用来关闭文件的,它的参数是调用 open 函数或者 create 函数成功后返回的文件句柄,是一个整型变量。用 close 的时候需要#include <unistd.h>举例子:/**************************** 源文件 eg.c ***********************************/#include <sys/types.h>#include <sys/stat.h>#include <fnct.h>/* 以上是调用 open 函数所需的头文件 */#include <unistd.h>int main(int argc, char **argv) { int fd; if (argc == 1) { 没有文件名,报错,或者提供一个默认的文件名; } fd = open(argv[1], O_RDWR); if(fd < 0) { 打开失败,报错,退出; } /* 成功打开文件之后 */ 各种操作; close(fd); return(0);}
『捌』 linux的头文件中是否有writeError函数
1.功能将数据写入已打开的文件内2.相关函数open,read,fcntl,close,lseek,sync,fsync,fwrite3.表头文件#include<unistd.h>4.定义函数ssize_t write (int fd,const void * buf,size_t count);5.函数说明write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。当然,文件读写位置也会随之移动。6.返回值如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。7.错误代码EINTR 此调用被信号所中断。EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。EBADF 参数fd非有效的文件描述词,或该文件已关闭。
『玖』 socket在windows下和linux下的区别
1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h 错误处理:errno.h 2)初始化 windows下需要用WSAStartupWSADATA wsaData; err = WSAStartup(0x202,&wsaData); if ( err != 0 ){ return 0; } else if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) //检测是否支持这个版本的socket { WSACleanup( ); return 0; }对应的退出清理用WSACleanup( );linux下不需要 3)关闭socket windows下closesocket(…) linux下close(…) 4)socket类型 windows下SOCKET linux下int 5)获取错误码 windows下WSAGetLastError() linux下errno变量extern int errno; int geterror(){return errno;}6)设置非阻塞 windows下ioctlsocket(server_socket,FIONBIO,&ul); int ul = 1linux下fcntl(server_socket,F_SETFL, O_NONBLOCK); <fcntl.h> 7)send函数最后一个参数 windows下一般设置为0 linux下必须是后几个参数用到的socket中,值最大的数(整型)加1 (另一种说法是设置为MSG_NOSIGNAL)8)毫秒级时间获取 windows下GetTickCount() linux下gettimeofday() 9)编译连接windows下ws2_32.liblinux下连接是使用参数:-lstdc 运行时需要libstdc++.so.5,可在/usr/lib目录中创建一个链接。 10)Socket操作错误返回值都为SOCKET_ERROR,他的值是-1 11)异常处理windows下没有对send()的异常处理,最后一个参数无效,写0就可以了。linux下当连接断开,还发数据的时候,不仅send()的返回值会有反映,而且还会像系统发送一个异常消息,如果不作处理,系统会出BrokePipe,程序会退出。为此,send()函数的最后一个参数可以设置MSG_NOSIGNAL,禁止send()函数向系统发送异常消息。 12)WSA宏 windows下WSA相关的操作linux下WSA相关的操作在Linux不必要,直接去掉即可3、多线程 多线程: (win)process.h –〉(linux)pthread.h _beginthread –> pthread_create _endthread –> pthread_exit
『拾』 close的Linux 中的close函数
头文件:#include <unistd.h>int close(int fd);返回值:成功返回0,出错返回-1并设置errno参数fd是要关闭的文件描述符。需要说明的是,当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是对于一个长年累月运行的程序(比如网络服务器),打开的文件描述符一定要记得关闭,否则随着打开的文件越来越多,会占用大量文件描述符和系统资源。应用于 Visual Basic 的 Close 语句Close 语句:关闭Open语句所打开的输入/输出 (I/O) 文件。语法Close[filenumberlist]可选的filenumberlist参数为一个或多个文件号,其中filenumber为任何有效的文件号,语法如下:[[#]filenumber] [,[#]filenumber]. . .说明若省略filenumberlist,则将关闭Open语句打开的所有活动文件。当关闭Output或Append打开的文件时,将属于此文件的最终输出缓冲区写入操作系统缓冲区。所有与该文件相关联的缓冲区空间都被释放。在执行Close语句时,文件与其文件号之间的关联将终结。
未经允许不得转载:山九号 » linuxclose头文件|linux用什么标识描述和控制文件