嵌入式习题

交叉编译工具使用

(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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值