使用C语言实现两种linux命令,20155212 C语言实现linux下pwd命令的两种方法

20155212 C语言实现linux下pwd命令的两种方法

学习pwd命令

通过man pwd命令查看

989c0a3ea8b7fad04061dc38c4e0677e.png

pwd [OPTION],一般不加参数

-P显示当前目录的物理路径

-L显示当前目录的连接路径

该命令用来显示目前所在的工作目录。指令英文原义:print work directory

系统调用

使用man -k dir | grep 2命令查看有哪些跟pwd相关的系统调用

0fe5cf53d7db57e1793ecbefcac58afc.png

这里有两个系统调用可能用到pwd中

getcwd()

61a8101b9e6fb6f20cfceead992703ad.png

功能:获取当前目录

参数

char *buf:存储当前路径的字符串

size_t size:buf的空间大小

返回值: 成功则返回指向当前路径字符串的指针,错误则返回NULL

readdir()

67d1ccf9d8cc85c437cb3d4a48df92c6.png

功能:readdir()返回参数dir目录流的下个目录进入点

参数:DIR * dir。结构dirent定义如下:

struct dirent{

ino_t d_ino;//此目录进入点的inode

off_t d_off;//目录文件开头至此目录进入点的位移

unsigned short int d_reclen;//记录的长度

unsigned char d_type;//文件类型

char d_name[256];

};

返回值:成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL

但是发现readdir()不能单独使用,

opendir()

54007bdbb44fa8cd6f7290696da0fc89.png

功能:opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值

参数:路径名

返回值:成功则返回DIR* 型态的目录流,打开失败则返回NULL。

chdir()

03c61e8e90c8bac43177da33a6dbf580.png

功能:切换当前目录

参数:路径名

伪代码

使用getcwd()

定义数组buf[MAXPATH];

调用getcwd(buf, MAXPATH);

输出返回值;

使用readdir()

while(1)

{

读取"."和".."的信息

if("."的inode==".."的inode)

{

退出;

}

else

{

chdir("..");

while(dirent->inode!=前面"."的inode)

{

dirent=readdir();

}

dirent->name入栈;

}

}

for 栈顶->栈底

print 栈顶信息

产品代码

使用getcwd()

#include

#include

#define MAXPATH 50

int main()

{

char path[MAXPATH];

puts(getcwd(path, MAXPATH));

return 0;

}

使用readdir()

#include

#include

#include

#include

#include

int main()

{

DIR *dirptr=NULL;

struct dirent *current_dirent=NULL, *parent_dirent=NULL, *tmp_dirent=NULL;

int count=0;

ino_t current_inode;

char path[256][256];

while(1)

{

dirptr=opendir(".");

do

{

current_dirent=readdir(dirptr);

}while(strcmp(current_dirent->d_name, ".")!=0);

current_inode=current_dirent->d_ino;

closedir(dirptr);

dirptr=opendir(".");

do

{

parent_dirent=readdir(dirptr);

}while(strcmp(parent_dirent->d_name, "..")!=0);

closedir(dirptr);

if(((long)parent_dirent->d_ino)==((long)current_dirent->d_ino))

{

break;

}

else

{

chdir("..");

dirptr=opendir(".");

do

{

tmp_dirent=readdir(dirptr);

}while(tmp_dirent->d_ino!=current_inode);

closedir(dirptr);

count++;

strcpy(path[count], tmp_dirent->d_name);

}

}

int i;

for(i=count;i>0;i--)

{

printf("/%s", path[i]);

}

printf("\n");

return 0;

}

测试

实现一:使用getcwd()实现pwd

40fd6134e28c881da32b8cba1df8425d.png

实现二:使用readdir()实现pwd

90f96c3a48412e7e86f47ac464ecceac.png

Linux 下操作GPIO(两种方法,驱动和mmap)(转载)

目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...

Linux 下操作gpio(两种方法,驱动和mmap)

目前我所知道的在linux下操作GPIO有两种方法: 1.  编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...

加分项——C语言实现Linux的pwd命令

加分项--C语言实现Linux的pwd命令 实现要求 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd pwd pw ...

20155308 加分项——C语言实现Linux的pwd命令

20155308 加分项--C语言实现Linux的pwd命令 实现要求 学习pwd命令 什么是pwd pwd' 代表的是'Print Working Directory'(打印当前目录).如它的名字那 ...

Linux下进程通信的八种方法

Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...

python执行linux命令的两种方法

python执行linux命令有两种方法: 在此以Linux常用的ls命令为例: 方法一:使用os模块 1 2 3 shell# python >> import os >> ...

Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件

Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件 交换文件 查看内存:free -m , -m是显示单位为MB,-g单位GB 创建一个文件:touch /root/swapfi ...

Linux下ps命令详解 Linux下ps命令的详细使用方法

http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...

linux 下部署nodejs(两种方式)

本次博客的编写时用的系统环境,刚装好的Centos 6.4  64位虚拟机. 另外关于linux 其他系统的安装 可以参考https://github.com/joyent/node/wiki/Ins ...

随机推荐

直播推流端弱网优化策略 | 直播 SDK 性能优化实践

弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...

extern c

extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C+ ...

Java父类子类的对象初始化过程

摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和 ...

Nginx的Upload上传模块

前段时间做一个项目,需要上传文件,差不多需要20M左右,普通用php处理会比较麻烦,经常超时,而且大量占用资源.于是搜索了下,决定用nginx的upload上传模块来处理. 你可以在这里:http:/ ...

MySql事务无法回滚的原因

使用MySQL时.假设发现事务无法回滚,但Hibernate.Spring.JDBC等配置又没有明显问题时.不要苦恼,先看看MySQL创建的表有没有问题.即表的类型. InnoDB和MyISAM是在使 ...

iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现

项目地址 :  https://github.com/zhonggaorong/QQLoginDemo/tree/master 最新版本的qq登录实现步骤实现: 1. 首先,你需要去向腾讯申请账号. ...

GCD API记录(二)

前言 这是关于GCD的第二篇文章,GCD的API有100多个,通过快捷键Option + 单击,可以在Reference中的Grand Central Dispatch (GCD) Reference ...

mysql表管理

4.1 查看所有表 查看所有表语句: show tables; 例: mysql> show tables; +-----------------+ | Tables_in_emp | +--- ...

简单的windows窗口创建实例

#include #include LRESULT CALLBACK WndProc(HWND hwnd,UINT umsg,WPARA ...

Android 编程下实现 Activity 的透明效果

实现方式一(使用系统透明样式) 通过配置 Activity 的样式来实现,在 AndroidManifest.xml 找到要实现透明效果的 Activity,在 Activity 的配置中添加如下的代 ...

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于Linux下的C语言实现的示例代码: 1. 引入相关头文件 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <linux/input.h> #include <sys/mman.h> #include <errno.h> #include <stdbool.h> #include <time.h> #include <SDL/SDL.h> #include <SDL/SDL_image.h> #include <SDL/SDL_ttf.h> ``` 需要安装SDL、SDL_image和SDL_ttf库。 2. 定义常量 ```c #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define IMAGE_WIDTH 320 #define IMAGE_HEIGHT 240 #define IMAGE_NUM 4 #define IMAGE_PATH "./image%d.bmp" ``` 定义屏幕宽度、高度、图片宽度、高度、图片数量和图片路径等常量。 3. 定义全局变量 ```c int touch_fd; int screen_fd; int *screen_mem; int current_image_index = 0; SDL_Surface *screen; SDL_Surface *images[IMAGE_NUM]; ``` 定义触摸屏文件描述符、屏幕文件描述符、屏幕内存映射指针、当前显示图片的索引和SDL界面和图片数组等全局变量。 4. 定义函数 ```c int init_touch_screen(); int init_screen(); int init_images(); void show_image(int index); void switch_image(int index); ``` 定义初始化触摸屏、初始化屏幕、初始化图片、显示图片和切换图片等函数。 5. 实现函数 ```c int init_touch_screen() { touch_fd = open("/dev/input/event0", O_RDONLY); if(touch_fd < 0) { printf("Open touch screen device failed.\n"); return -1; } return 0; } int init_screen() { screen_fd = open("/dev/fb0", O_RDWR); if(screen_fd < 0) { printf("Open screen device failed.\n"); return -1; } screen_mem = mmap(NULL, SCREEN_WIDTH * SCREEN_HEIGHT * 4, PROT_READ | PROT_WRITE, MAP_SHARED, screen_fd, 0); if(screen_mem == MAP_FAILED) { printf("Map screen memory failed.\n"); return -1; } screen = SDL_CreateRGBSurfaceFrom(screen_mem, SCREEN_WIDTH, SCREEN_HEIGHT, 32, SCREEN_WIDTH * 4, 0, 0, 0, 0); if(screen == NULL) { printf("Create screen surface failed.\n"); return -1; } SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0)); SDL_UpdateRect(screen, 0, 0, 0, 0); return 0; } int init_images() { int i; char image_path[64]; for(i = 0; i < IMAGE_NUM; i++) { sprintf(image_path, IMAGE_PATH, i + 1); images[i] = IMG_Load(image_path); if(images[i] == NULL) { printf("Load image %s failed: %s.\n", image_path, IMG_GetError()); return -1; } } return 0; } void show_image(int index) { SDL_Rect src_rect; SDL_Rect dest_rect; src_rect.x = 0; src_rect.y = 0; src_rect.w = IMAGE_WIDTH; src_rect.h = IMAGE_HEIGHT; dest_rect.x = (SCREEN_WIDTH - IMAGE_WIDTH) / 2; dest_rect.y = (SCREEN_HEIGHT - IMAGE_HEIGHT) / 2; dest_rect.w = IMAGE_WIDTH; dest_rect.h = IMAGE_HEIGHT; SDL_BlitSurface(images[index], &src_rect, screen, &dest_rect); SDL_UpdateRect(screen, 0, 0, 0, 0); } void switch_image(int index) { int i, j; SDL_Rect src_rect; SDL_Rect dest_rect; src_rect.x = 0; src_rect.y = 0; src_rect.w = IMAGE_WIDTH; src_rect.h = IMAGE_HEIGHT; dest_rect.x = (SCREEN_WIDTH - IMAGE_WIDTH) / 2; dest_rect.y = (SCREEN_HEIGHT - IMAGE_HEIGHT) / 2; dest_rect.w = IMAGE_WIDTH; dest_rect.h = IMAGE_HEIGHT; if(index == current_image_index) { return; } if(index > current_image_index) { for(i = current_image_index; i < index; i++) { SDL_BlitSurface(images[i], &src_rect, screen, &dest_rect); SDL_UpdateRect(screen, 0, 0, 0, 0); for(j = 1; j <= IMAGE_HEIGHT; j++) { SDL_BlitSurface(images[i + 1], &src_rect, screen, &dest_rect); SDL_UpdateRect(screen, 0, 0, 0, 0); SDL_Delay(2); dest_rect.y--; } } } else { for(i = current_image_index; i > index; i--) { SDL_BlitSurface(images[i], &src_rect, screen, &dest_rect); SDL_UpdateRect(screen, 0, 0, 0, 0); for(j = 1; j <= IMAGE_HEIGHT; j++) { SDL_BlitSurface(images[i - 1], &src_rect, screen, &dest_rect); SDL_UpdateRect(screen, 0, 0, 0, 0); SDL_Delay(2); dest_rect.y++; } } } current_image_index = index; } ``` 实现初始化触摸屏、初始化屏幕、初始化图片、显示图片和切换图片等函数。 6. 实现主函数 ```c int main(int argc, char *argv[]) { int x, y; bool touch_down = false; int touch_down_x, touch_down_y; struct input_event touch_event; if(init_touch_screen() < 0) { return -1; } if(init_screen() < 0) { return -1; } if(init_images() < 0) { return -1; } show_image(current_image_index); while(true) { if(read(touch_fd, &touch_event, sizeof(touch_event)) == sizeof(touch_event)) { if(touch_event.type == EV_ABS) { if(touch_event.code == ABS_X) { x = (touch_event.value - 200) * SCREEN_WIDTH / 620; } else if(touch_event.code == ABS_Y) { y = (touch_event.value - 200) * SCREEN_HEIGHT / 380; } } else if(touch_event.type == EV_KEY) { if(touch_event.code == BTN_TOUCH) { touch_down = touch_event.value; if(touch_down) { touch_down_x = x; touch_down_y = y; } else { if(x < SCREEN_WIDTH / 2 && y < SCREEN_HEIGHT / 2) { switch_image(0); } else if(x < SCREEN_WIDTH / 2 && y >= SCREEN_HEIGHT / 2) { switch_image(1); } else if(x >= SCREEN_WIDTH / 2 && y < SCREEN_HEIGHT / 2) { switch_image(2); } else { switch_image(3); } } } } } } return 0; } ``` 实现主函数,监听触摸屏的事件,根据触摸屏的位置切换图片,并实现图片切换效果。 7. 编译运行程序 使用以下命令编译程序: ``` gcc -o touch_screen touch_screen.c -lSDL -lSDL_image -lSDL_ttf ``` 使用以下命令运行程序: ``` sudo ./touch_screen ``` 8. 效果展示 当触摸屏位于左上区域时,显示image1.bmp图片并实现掉落效果;当触摸屏位于左下区域时,显示image2.bmp图片并实现滚动效果;当触摸屏位于右上区域时,显示image3.bmp图片并实现掉落效果;当触摸屏位于右下区域时,显示image4.bmp图片并实现滚动效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值