C语言编写Copy程序(Linux环境下的操作)

COPY程序的编写

(作者:Baron_wu 禁止转载)

一、实验描述

在这个实验中,我们要做一个程序,这个程序是将一个文件的内容复制到一个目标文件。首先这个程序提示用户输入要复制的原始文件的名字,以及要复制到的目标文件的名字。
确保包括必要的错误检查,包括确保原始文件存在。再使用程序的同时我们要监视这个过程中所用到的系统调用。Linux可使用strace来完成。

二、相关原理与知识

(完成实验所用到的相关原理与知识)
系统调用的工作方式:
一般的,进程是不能访问内核的。它不能访问内核所占内存空间也不能调用内核函数。CPU硬件决定了这些(这就是为什么它被称作"保护模式")。系统调用是这些规则的一个例外。其原理是进程先用适当的值填充寄存器,然后调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。在Intel CPU中,这个由中断0x80实现。硬件知道一旦你跳到这个位置,你就不是在限制模式下运行的用户,而是作为操作系统的内核–所以你就可以为所欲为。
进程可以跳转到的内核位置叫做sysem_call。这个过程检查系统调用号,这个号码告诉内核进程请求哪种服务。然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。接着,就调用函数,等返回后,做一些系统检查,最后返回到进程(或到其他进程,如果这个进程时间用尽)。如果你希望读

  • 10
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在linux系统下用c语言编写一个word界面,可以使用GTK+图形界面库来创建窗口、菜单、工具栏等控件,再通过libreoffice或其他文本编辑器实现文本输入和编辑。 下面是一个简单的示例代码,可以创建一个带有菜单、工具栏、编辑区域的word界面: ```c #include <gtk/gtk.h> static void new_file(GtkWidget *widget, gpointer data) { // 创建新文件 } static void open_file(GtkWidget *widget, gpointer data) { // 打开文件 } static void save_file(GtkWidget *widget, gpointer data) { // 保存文件 } static void save_as_file(GtkWidget *widget, gpointer data) { // 另存为文件 } static void cut_text(GtkWidget *widget, gpointer data) { // 剪切文本 } static void copy_text(GtkWidget *widget, gpointer data) { // 复制文本 } static void paste_text(GtkWidget *widget, gpointer data) { // 粘贴文本 } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *menu_bar; GtkWidget *file_menu; GtkWidget *edit_menu; GtkWidget *new_item; GtkWidget *open_item; GtkWidget *save_item; GtkWidget *save_as_item; GtkWidget *cut_item; GtkWidget *copy_item; GtkWidget *paste_item; GtkWidget *toolbar; GtkWidget *button_new; GtkWidget *button_open; GtkWidget *button_save; GtkWidget *button_cut; GtkWidget *button_copy; GtkWidget *button_paste; GtkWidget *vbox; GtkWidget *text_view; GtkTextBuffer *buffer; gtk_init(&argc, &argv); // 创建窗口 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Word"); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); // 创建菜单栏 menu_bar = gtk_menu_bar_new(); gtk_container_add(GTK_CONTAINER(window), menu_bar); // 创建“文件”菜单 file_menu = gtk_menu_new(); new_item = gtk_menu_item_new_with_label("New"); open_item = gtk_menu_item_new_with_label("Open"); save_item = gtk_menu_item_new_with_label("Save"); save_as_item = gtk_menu_item_new_with_label("Save As"); gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), new_item); gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), open_item); gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), save_item); gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), save_as_item); gtk_menu_item_set_submenu(GTK_MENU_ITEM(new_item), file_menu); // 创建“编辑”菜单 edit_menu = gtk_menu_new(); cut_item = gtk_menu_item_new_with_label("Cut"); copy_item = gtk_menu_item_new_with_label("Copy"); paste_item = gtk_menu_item_new_with_label("Paste"); gtk_menu_shell_append(GTK_MENU_SHELL(edit_menu), cut_item); gtk_menu_shell_append(GTK_MENU_SHELL(edit_menu), copy_item); gtk_menu_shell_append(GTK_MENU_SHELL(edit_menu), paste_item); // 将菜单项添加到菜单栏 gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), new_item); gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), edit_menu); // 创建工具栏 toolbar = gtk_toolbar_new(); gtk_container_add(GTK_CONTAINER(window), toolbar); // 创建工具栏按钮 button_new = gtk_tool_button_new_from_stock(GTK_STOCK_NEW); button_open = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN); button_save = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE); button_cut = gtk_tool_button_new_from_stock(GTK_STOCK_CUT); button_copy = gtk_tool_button_new_from_stock(GTK_STOCK_COPY); button_paste = gtk_tool_button_new_from_stock(GTK_STOCK_PASTE); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), button_new, -1); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), button_open, -1); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), button_save, -1); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), gtk_separator_tool_item_new(), -1); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), button_cut, -1); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), button_copy, -1); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), button_paste, -1); // 创建垂直布局容器 vbox = gtk_vbox_new(FALSE, 5); gtk_container_add(GTK_CONTAINER(window), vbox); // 创建文本编辑区域 text_view = gtk_text_view_new(); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view)); gtk_box_pack_start(GTK_BOX(vbox), text_view, TRUE, TRUE, 0); // 显示窗口和控件 gtk_widget_show_all(window); // 进入主循环 gtk_main(); return 0; } ``` 在这个示例,我们创建了一个带有菜单、工具栏、编辑区域的word界面。通过创建菜单项和工具栏按钮,我们可以实现文件的新建、打开、保存、剪切、复制、粘贴等操作。通过创建文本编辑区域,我们可以实现文本的输入和编辑。 需要注意的是,这个示例只是一个简单的演示,实际上要实现一个完整的word界面还需要处理很多细节,比如字体、颜色、格式等。你可以在这个基础上逐步完善功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值