交叉编译工具使用
(1)直接运行交叉编译后的hello,观察结果;
(2)仿真运行
这里使用QEMU作为ARM硬件平台的仿真。可以运行交叉编译后的hello。其命令如下:
qemu-arm -L /usr/arm-linux-gnueabi -cpu cortex-a15 hello
其中:-L 指定库文件的路径
-cpu 指定处理器为cortex-a15
安装嵌入式开发工具
(1)更新安装源
sudo apt-get update
(2)安装 gcc-arm-linux-gnueabi
sudo apt-get install gcc-arm-linux-gnueabi
(3)验证安装成功与否
arm-linux-gnueabi-gcc -v
如能正确显示其版本号。表明安装成功。
文件的创建
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
/********** BEGIN **********/
int ret = creat("testFile", S_IRUSR | S_IWUSR | S_IRGRP | S_IXGRP | S_IXOTH);
if (ret == -1)
{
printf("创建文件失败\n");
}
else
{
printf("创建文件成功\n");
}
/********** END **********/
return 0;
}
文件打开与关闭
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
/************************
* fileName: 需要被打开的文件路径
*************************/
int open_File(char *fileName)
{
int fd = 0; //存放文件描述符
/********** BEGIN **********/
fd = open(fileName, O_RDONLY);
if (fd == -1) {
printf("打开文件失败\n");
} else {
printf("打开文件成功\n");
}
/********** END **********/
return fd;
}
/************************
* fd: 需要被关闭的文件描述符
*************************/
void close_File(int fd)
{
/********** BEGIN **********/
int ret = close(fd);
if(ret == -1) {
printf("关闭文件失败\n");
} else {
printf("关闭文件成功\n");
}
/********** END **********/
}
文件读写操作
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
/************************
* fd: 被打开文件的描述符
* buf: 被写入字符串指针
*************************/
int write_File(int fd, char *buf)
{
int writeSize = 0; //返回实际写入的字符个数
/********** BEGIN **********/
writeSize = write(fd,buf,strlen(buf));
if(writeSize == -1) {
printf("写入文件失败\n");
} else {
printf("写入文件成功:写入%ld个字符\n", writeSize);
}
/********** END **********/
return writeSize;
}
/************************
* fd: 被打开文件的描述符
* buf: 存放读取的字符串指针(假设buf足够大)
*************************/
int readLine(int fd, char *buf)
{
int readSize = 0; //返回实际读取的字符个数
//提示:使用while循环每次只读取一个字符,判断该字符是否为换行符或者是否已经读取到文件末尾(读取到文件末尾返回值为0)
/********** BEGIN **********/
char ch;
int ret = read(fd,&ch,1);
while(ret != 0 && ch != '\n') {
buf[readSize++] = ch;
ret = read(fd,&ch,1);
}
/********** END **********/
return readSize;
}
文件的删除
int main()
{
/********** BEGIN **********/
int ret = remove("testFile");
if (ret == -1)
{
printf("删除文件失败\n");
}
else
{
printf("删除文件成功\n");
}
/********** END **********/
return 0;
}
进程等待
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int g_i4event;
int process_wait(void)
{
/********Begin********/
int rc=fork();
g_i4event=1;
if(rc==0){
sleep (3);
}else{
sleep (1);
g_i4event=2;
waitpid(rc,NULL,0);
g_i4event=3;
}
/*********End*********/
}
int process_waitpid(void)
{
/********Begin********/
int rc=fork();
g_i4event=1;
if(rc==0){
sleep (3);
}else{
sleep (1);
g_i4event=2;
waitpid(rc,NULL,0);
g_i4event=3;
}
/*********End*********/
}
进程退出控制
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int g_i4event;
int father_son(void)
{
/********Begin********/
int rc=fork();
g_i4event=1;
if(rc==0){
sleep (2);
}else{
sleep (1);
g_i4event=2;
}
/*********End*********/
}
int son_father_nowait(void)
{
/********Begin********/
int rc=fork();
g_i4event=1;
if(rc==0){
sleep (1);
}else{
sleep (2);
g_i4event=3;
}
/*********End*********/
}
int son_father_wait(void)
{
/********Begin********/
int rc=fork();
g_i4event=1;
if(rc==0){
sleep (1);
}else{
sleep (1);
g_i4event=4;
}
/*********End*********/
}
system系统调用
#include <unistd.h>
#include <stdlib.h>
int g_i4event;
int do_system(void)
{
/********Begin********/
if(system("touch ./test.dat")!= -1)
{
g_i4event= 1;
return 0;
}
return -1;
/*********End*********/
}
TCP套接字创建与端口绑定
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
/************************
* sockfd: 已经创建的套接字
* port: 需要绑定的端口号
* 返回值: 调用成功返回0,否则返回-1
*************************/
int bindSocket(int sockfd, unsigned short port)
{
int ret = -1;
/********** BEGIN **********/
struct sockaddr_in addr;
bzero(&addr, sizeof(addr)); //清空
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
{
printf("绑定端口失败: %s\n", strerror(errno));
return -1;
}
else
{
printf("绑定端口%d成功\n", port);
return 0;
}
/********** END **********/
return ret;
}
TCP监听与接收连接
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
{
printf("创建TCP套接字失败: %s\n", strerror(errno));
return -1;
}
struct sockaddr_in addr;
bzero(&addr, sizeof(addr)); //清空
addr.sin_family = AF_INET;
addr.sin_port = htons(8888);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
//与8888端口进行绑定
if(bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
{
printf("绑定端口失败: %s\n", strerror(errno));
return -1;
}
//监听8888端口,并设置最大监听个数大于1
/********** BEGIN **********/
if(listen(sockfd,1) == -1)
{
return -1;
}
/********** END **********/
//接受来自客户端的第一个连接请求
/********** BEGIN **********/
int clientSockfd;
struct sockaddr_in clientAddr;
socklen_t clientAddrSize = sizeof(struct sockaddr_in);
//接受连接请求
if((clientSockfd = accept(sockfd, (struct sockaddr *)&clientAddr, &clientAddrSize)) == -1)
{
return -1;
}
/********** END **********/
close(sockfd);
return 0;
}
TCP连接的建立与终止
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#define SERVER_IP "127.0.0.1"
/************************
* ipAddr: 远程服务器的IP地址
* port: 远程服务器的端口
*************************/
void connectSocket(char *ipAddr, unsigned short port)
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
{
printf("创建TCP套接字失败: %s\n", strerror(errno));
return ;
}
//连接到指定的服务器
/********** BEGIN **********/
struct sockaddr_in servAddr;
bzero(&servAddr, sizeof(servAddr)); //清空
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(port);
//使用inet_addr函数将点分十进制的IP转换成一个长整数型数
servAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
if(connect(sockfd, (struct sockaddr *)&servAddr, sizeof(servAddr)) != -1)
{
return 1;
}
/********** END **********/
close(sockfd);
}
TCP数据传送
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#define PORT 8888
int main()
{
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
{
return -1;
}
struct sockaddr_in addr;
bzero(&addr, sizeof(addr)); //清空
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
//与PORT端口进行绑定
if(bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
{
return -1;
}
//监听PORT端口,并设置最大监听个数为5
if(listen(sockfd, 5) == -1)
{
return -1;
}
int clientSockfd;
struct sockaddr_in clientAddr;
socklen_t clientAddrSize = sizeof(struct sockaddr_in);
//接受连接请求
if((clientSockfd = accept(sockfd, (struct sockaddr *)&clientAddr, &clientAddrSize)) == -1)
{
return -1;
}
else
{
char data[100];
//接收客户端传来的数据,并打印出来(提示:换行打印)
//同时将接收到的数据原样发送给客户端
/********** BEGIN **********/
memset(data, 0, sizeof(data));
while(recv(clientSockfd, data, sizeof(data), 0) > 0)
{
send(clientSockfd, data, strlen(data), 0); //发送数据
printf("%s\n", data);
memset(data, 0, sizeof(data)); //清空上次接收的缓存
}
/********** END **********/
}
close(clientSockfd);
close(sockfd);
return 0;
}
创建线程
#include <pthread.h>
/************************
* 参数start_routine: 函数指针,用于指向线程函数
* 参数arg: 是线程函数的参数
* 返回值: 返回线程ID
*************************/
pthread_t createThread(void *(*start_routine) (void *), void *arg)
{
pthread_t thread;
/********** BEGIN **********/
int ret = pthread_create(&thread, NULL, start_routine, arg);
if(ret != 0)
{
printf("创建线程失败\n");
return -1;
}
/********** END **********/
return thread;
}
线程挂起
#include <pthread.h>
/************************
* 参数thread: 需要等待结束的线程ID号
* 返回值: 等待成功返回0,失败返回-1
* 提示: 忽略线程返回值
*************************/
int waitThread(pthread_t thread)
{
int ret = -1;
/********** BEGIN **********/
if(pthread_join(thread, NULL) != 0)
{
return -1;
}
return 0;
/********** END **********/
return ret;
}
线程终止
#include <pthread.h>
/************************
* 参数thread: 需要等待结束的线程ID号
* 返回值: 等待成功返回0,失败返回-1
* 提示: 忽略线程返回值
*************************/
int cancelThread(pthread_t thread)
{
int ret = -1;
/********** BEGIN **********/
ret = pthread_cancel(thread);
if(ret != 0)
{
printf("cancel thread(%lu) failure\n", thread);
return -1;
}
return 0;
/********** END **********/
return ret;
}