windows编程 linux编程(docker windows)
本篇文章给大家谈谈windows编程 linux编程,以及docker windows对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
linux下编程和windows下的编程有什么区别
Linux编程C语言用的比较多一些,C++语言也常用,Linux编程调用的接口叫做“系统调用”,C标准库、第三方开源C/C++库也是常用的,Linux编程会用到许多代码库,代码库选择上比较灵活;但是Windows编程C语言就用的少了,用C语言调用Windows API编程叫做Win32编程,微软将Windows API作了C++封装,封装成了C++库叫MFC,因为MFC库是和微软编程工具VC++/VS进行捆绑的,加上MFC编程的便捷,所以Windows编程C语言用的比较少,而C++语言用的比较多,后来微软退出.NET平台后,C#语言也成为了Windows编程的主流语言。
另外就是Linux编程,编写命令行程序仍然占很大比例,而Windows命令行编程已经非常少了,Windows主要是图形界面编程。还有就是Linux上脚本编程很普遍,而Windows上脚本编程的程序规模都比较小,鉴于脚本语言(除了shell脚本)是跨平台的,在Windows上也可以用,而且有些脚本编程属于Web开发的范畴,这里就不讨论了。
如何在windows下或者linux下对树莓派编程(C语言或C++)
Raspberry Pi(中文名为“树莓派”,简写为RPi,或者RasPi/RPi)是为学生计算机编程教育而设计,只有信用卡大小的卡片式电脑,其系统基于Linux。自问世以来,受众多计算机发烧友和创客的追捧,曾经一“派”难求。别看其外表“娇小”,内“心”却很强大,视频、音频等功能通通皆有,可谓是“麻雀虽小,五脏俱全”。
树莓派定位于学习。可以学操作系统,编程,也可以学习嵌入编程,工业控制,人工智能等等。它比其它的几款比如arduio要全面些。当然在某些方面也弱些。国外把树莓派的功能发挥差不多到极致。几乎所有的领域都有树莓派的身影。从并行计算,到机器人,到3D打印,探索太空,家庭防盗,路由器,PAD都有。国内与国外的用法基本相同。只是国人更在于家庭用途。都是些动手能力强的人玩的小玩具。
“树莓派”的系统是基于Linux。因此树莓派里的编程完全和Linux相同,使用Linux下的编译器编译程序并运行。树莓派不能进行windows下的编程。
例程:
//在home/pi/文件夹下建立一个hello.c文件,输入以下内容
#include<stdio.h>
voidmain(void)
{
printf("Hello!ThisismyfirstCprogram.\r\n");
}
//在终端输入gcchello.c-ohello实现对hello.c的编译和连接
//./hello执行生成的可执行文件hello
Windows Socket和Linux Socket编程的区别
SOCKET在原理上应该是一样的,只是不同系统的运行机置有些不同。
Socket编程 windows到Linux代码移植遇到的问题
1、一些常用函数的移植
2、网络
socket相关程序从windows移植到linux下需要注意的
1)头文件
windows下winsock.h/winsock2.h
linux下sys/socket.h
错误处理:errno.h
其他常用函数的头文件可到命令行下用man指令查询。
2)初始化
windows下需要用WSAStartup
linux下不需要(很方便),直接可以使用
3)关闭socket
windows下closesocket(...)
linux下close(...)
4)类型
windows下SOCKET
在linux下为int类型
5)绑定地址的结构体
名称相同,都是struct sockaddr、struct sockaddr_in,这两者通常转换使用;
在Windows下面名称都是大写,而在Linux下为小写
常用:
Linux下:
sockaddr_in destAddr;
destAdd.sin_family=AF_INET;
destAddr.sin_port=htons(2030);
destAddr.sin_addr.s_addr=inet_addr("192.168.1.1");
Windows下:
SOCKADDR_IN destAddr;
destAddr.sin_addr.S_un.S_addr=inet_addr("192.168.1.1");
但结构体中成员的名称不同
Windows中结构体成员
struct sockaddr_in{
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
struct sockaddr{
u_short sa_family;
char sa_data[14];
};
struct in_addr{
union{
struct{ u_char s_b1,s_b2,s_b3,s_b4;} S_un_b;
struct{ u_short s_w1,s_w2;} S_un_w;
u_long S_addr;
} S_un;
};
下面的一些宏可以使windows下的程序移植到linux下(通过类型的重新定义,使代码具有linux和windows下的移植性)
[cpp] view plaincopy
#ifdef WIN32
typedef 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)
#endif
[cpp] view plaincopy
#ifdef WIN32
typedef 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)
#endif
6)获取错误码
windows下getlasterror()/WSAGetLastError()
linux下errno变量
7)设置非阻塞
windows下ioctlsocket()
linux下fcntl()<fcntl.h>
8)send函数最后一个参数
windows下一般设置为0
linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可能会导致程序退出。
9)毫秒级时间获取
windows下GetTickCount()
linux下gettimeofday()
10)数据类型的一些转化
通用的:
小端到大端(网络协议使用)的转换:htonl, htons
点分十进制IP和整数之间的相互转换:inet_addr()(该函数将点分十进制转为整数),inet_aton(),inet_ntoa(),inet_pton()(linux下独有该函数可以实现相互之间的转换)
使用到的头文件不相同,linux下用man命令查询。
另外注意:
linux下使用的套接字为伯克利套接字,因此在select()函数的使用上(第一个参数的设置)也有区别;
windows下为了与伯克利套接字匹配,第一个参数是无所谓,一般可设为0;
int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!
3、多线程
多线程:(win)process.h--〉(linux)pthread.h
_beginthread--> pthread_create
_endthread--> pthread_exit