MENU

分类 Linux开发 下的文章

DNF 命令浅解

DNF新一代的RPM软件包管理器。他首先出现在 Fedora 18 这个发行版中。而最近,他取代了YUM,正式成为 Fedora 22 的默认包管理器。

DNF包管理器改进了YUM的一些不足,包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。

DNF使用 RPM, libsolv 和 hawkey 库进行包管理操作。

查看 DNF 包管理器版本

用处:该命令用于查看安装在您系统中的 DNF 包管理器的版本

命令:# dnf –version

查看系统中可用的 DNF 软件库

用处:该命令用于显示系统中可用的 DNF 软件库

命令:# dnf repolist

查看系统中可用和不可用的所有的 DNF 软件库

用处:该命令用于显示系统中可用和不可用的所有的 DNF 软件库

命令:# dnf repolist all

列出所有 RPM 包

用处:该命令用于列出用户系统上的所有来自软件库的可用软件包和所有已经安装在系统上的软件包

命令:# dnf list

列出所有安装了的 RPM 包

用处:该命令用于列出所有安装了的 RPM 包

命令:# dnf list installed

列出所有可供安装的 RPM 包

用处:该命令用于列出来自所有可用软件库的可供安装的软件包

命令:# dnf list available

搜索软件库中的 RPM 包

用处:当你不知道你想要安装的软件的准确名称时,你可以用该命令来搜索软件包。你需要在”search”参数后面键入软件的部分名称来搜索。(在本例中我们使用”nano”)

命令:# dnf search nano

查找某一文件的提供者

用处:当你想要查看是哪个软件包提供了系统中的某一文件时,你可以使用这条命令。(在本例中,我们将查找”/bin/bash”这个文件的提供者)

命令:# dnf provides /bin/bash

查看软件包详情

用处:当你想在安装某一个软件包之前查看它的详细信息时,这条命令可以帮到你。(在本例中,我们将查看”nano”这一软件包的详细信息)

命令:# dnf info nano

安装软件包

用处:使用该命令,系统将会自动安装对应的软件及其所需的所有依赖(在本例中,我们将用该命令安装nano软件)

命令:# dnf install nano

升级软件包

用处:该命令用于升级制定软件包(在本例中,我们将用命令升级”systemd”这一软件包)

命令:# dnf update systemd

检查系统软件包的更新

用处:该命令用于检查系统中所有软件包的更新

命令:# dnf check-update

升级所有系统软件包

用处:该命令用于升级系统中所有有可用升级的软件包

命令:# dnf update 或 # dnf upgrade

删除软件包

用处:删除系统中指定的软件包(在本例中我们将使用命令删除”nano”这一软件包)

命令:# dnf remove nano 或 # dnf erase nano

删除无用孤立的软件包

用处:当没有软件再依赖它们时,某一些用于解决特定软件依赖的软件包将会变得没有存在的意义,该命令就是用来自动移除这些没用的孤立软件包。

命令:# dnf autoremove

删除缓存的无用软件包

用处:在使用 DNF 的过程中,会因为各种原因在系统中残留各种过时的文件和未完成的编译工程。我们可以使用该命令来删除这些没用的垃圾文件。

命令:# dnf clean all

获取有关某条命令的使用帮助

用处:该命令用于获取有关某条命令的使用帮助(包括可用于该命令的参数和该命令的用途说明)(本例中我们将使用命令获取有关命令”clean”的使用帮助)

命令:# dnf help clean

查看所有的 DNF 命令及其用途

用处:该命令用于列出所有的 DNF 命令及其用途

命令:# dnf help

查看 DNF 命令的执行历史

用处:您可以使用该命令来查看您系统上 DNF 命令的执行历史。通过这个手段您可以知道在自您使用 DNF 开始有什么软件被安装和卸载。

命令:# dnf history

查看所有的软件包组

用处:该命令用于列出所有的软件包组

命令:# dnf grouplist

安装一个软件包组

用处:该命令用于安装一个软件包组(本例中,我们将用命令安装”Educational Software”这个软件包组)

命令:# dnf groupinstall ‘Educational Software’

升级一个软件包组中的软件包

用处:该命令用于升级一个软件包组中的软件包(本例中,我们将用命令升级”Educational Software”这个软件包组中的软件)

命令:# dnf groupupdate ‘Educational Software’

删除一个软件包组

用处:该命令用于删除一个软件包组(本例中,我们将用命令删除”Educational Software”这个软件包组)

命令:# dnf groupremove ‘Educational Software’

从特定的软件包库安装特定的软件

用处:该命令用于从特定的软件包库安装特定的软件(本例中我们将使用命令从软件包库 epel 中安装 phpmyadmin 软件包)

命令:# dnf –enablerepo=epel install phpmyadmin

更新软件包到最新的稳定发行版

用处:该命令可以通过所有可用的软件源将已经安装的所有软件包更新到最新的稳定发行版

命令:# dnf distro-sync

重新安装特定软件包

用处:该命令用于重新安装特定软件包(本例中,我们将使用命令重新安装”nano”这个软件包)

命令:# dnf reinstall nano

回滚某个特定软件的版本

用处:该命令用于降低特定软件包的版本(如果可能的话)(本例中,我们将使用命令降低”acpid”这个软件包的版本)

命令:# dnf downgrade acpid

样例输出:

Using metadata from Wed May 20 12:44:59 2015

No match for available package: acpid-2.0.19-5.el7.x86_64

Error: Nothing to do.

原作者注:在执行这条命令的时候, DNF 并没有按照我期望的那样降级指定的软件(“acpid”)。该问题已经上报。

总结

DNF 包管理器作为 YUM 包管理器的升级替代品,它能自动完成更多的操作。但在我看来,正因如此,所以 DNF 包管理器不会太受那些经验老道的 Linux 系统管理者的欢迎。举例如下:

  • 在 DNF 中没有 –skip-broken 命令,并且没有替代命令供选择。
  • 在 DNF 中没有判断哪个包提供了指定依赖的 resolvedep 命令。
  • 在 DNF 中没有用来列出某个软件依赖包的 deplist 命令。
  • 当你在 DNF 中排除了某个软件库,那么该操作将会影响到你之后所有的操作,不像在 YUM 下那样,你的排除操作只会咋升级和安装软件时才起作用。

我相信几乎所有的 Linux 用户都会很高兴看到 Linux 生态圈不断地发展壮大。先是 systemd 代替了源于 System V 的 init ,而如今, DNF 包管理器已经在 Fedora 22 上替代了 YUM 包管理器,并且很快它也将登陆 RHEL 和 CentOS 。

此时此刻的你将作何感想?难道这整一个 Linux 生态圈已经变得不重视它的用户们,并且往与用户期望完全相反的方向发展了么?现在,没有任何问题的 System V 和 YUM 被迫淡出历史舞台,这让我不禁想起 IT 从业者的一句老话“为何要修复没有损坏的东西?(Why fix, If not broken?)”。

C语言第四次作业

[box style="info"]我们做了这么多,只是为了您的一个评分,一个点赞。[/box]

like_it

P.218

3.写一个判断素数的函数,在主函数输入一个整数,输出是否为素数的信息。

#include <stdio.h>

int main()
{
	int isPrime(int n);
	int n;

	printf("input a number:\n");
	scanf("%d",&n);
	if(isPrime(n))
		printf("%d is a prime\n",n);
	else
		printf("%d is not a prime\n",n);
	return 0;
}

int isPrime(int n)
{
	int i,flag=1;
	for(i=2;i<n;i++)
		if(n%i==0)
			flag=0;
	return(flag);
}

4.写一个函数,使给定的一个3×3的二维整型数组转置,即行列互换。

#include <stdio.h>

int a[3][3];

int main()
{
	void convert(int a[3][3]);
	int cnt1,cnt2;;
	for(cnt1=0;cnt1<3;cnt1++)
	{
		printf("input the no.%d line's data(3 num):\n",cnt1+1);
		scanf("%d %d %d",&a[cnt1][0],&a[cnt1][1],&a[cnt1][2]);
	}
	putchar('\n');
	//output the data before being converted
	printf("before:\n");
	for(cnt1=0;cnt1<3;cnt1++)
	{
		for(cnt2=0;cnt2<3;cnt2++)
			printf("%d\t",a[cnt1][cnt2]);
		putchar('\n');
	}	
	//convert
	convert(a);
	//output the data after being converted
	putchar('\n');
	printf("after:\n");
	for(cnt1=0;cnt1<3;cnt1++)
	{
		for(cnt2=0;cnt2<3;cnt2++)
			printf("%d\t",a[cnt1][cnt2]);
		putchar('\n');
	}	
}

void convert(int a[3][3])
{
	int cnt1,cnt2;
	int temp;
	for(cnt1=0;cnt1<3;cnt1++)
		for(cnt2=cnt1+1;cnt2<3;cnt2++)
		{
			temp=a[cnt1][cnt2];
			a[cnt1][cnt2]=a[cnt2][cnt1];
			a[cnt2][cnt1]=temp;
		}
}

5.写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。

#include <stdio.h>
#include <string.h>

int main()
{
	void convert(char str[]);
	char str[100],c;
	gets(str);
	convert(str);
	printf("%s\n",str);
}

void convert(char str[])
{
	int len,i;
	char temp;
	len=strlen(str);
	for(i=0;i<len/2;i++)
	{
		temp=str[i];
		str[i]=str[len-1-i];
		str[len-1-i]=temp;
	}
}

P.291

1.输入3个整数,按由小到大的顺序输出。

#include <stdio.h>

int main()
{
	int *p_max,*p_min,*p_mid;
	int max(int a[3]);
	int min(int a[3]);
	int a[3],i;
	printf("input 3 numbers:\n");
	for(i=0;i<3;i++)
	{
		scanf("%d",&a[i]);
	}
	//printf("%d %d\n",min(a),max(a));
	p_max=&a[max(a)];
	p_min=&a[min(a)];
	p_mid=&a[3-max(a)-min(a)];
	printf("%d>%d>%d\n",*p_max,*p_mid,*p_min);
}

int max(int a[3])
{
	int key=0,i;
	for(i=0;i<3;i++)
	{
		if(a[i]>a[key])
			key=i;
	}
	return(key);
}

int min(int a[3])
{
	int key=0,i;
	for(i=0;i<3;i++)
	{
		if(a[i]<a[key])
			key=i;
	}
	return(key);
}

2.输入3个字符串,按由小到大的顺序输出。

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[50],str2[50],str3[50];
	void swap(char *p1,char *p2);
	int i;
	printf("input 3 lines:\n");
	gets(str1);
	gets(str2);
	gets(str3);
	if(strcmp(str1,str2)>0) swap(str1,str2);
	if(strcmp(str1,str3)>0) swap(str1,str3);
	if(strcmp(str2,str3)>0) swap(str2,str3);
	printf("\norder:\n");
	printf("%s\n%s\n%s\n",str1,str2,str3);
	return 0;
}

void swap(char *p1,char *p2)
{
	char t[50];
	strcpy(t,p1);
	strcpy(p1,p2);
	strcpy(p2,t);
}

3.输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:

a.输入10个整数;b.进行处理;c.输出10个整数。

#include <stdio.h>



int main()
{
	void input(int *);
	void deal(int *);
	void output(int *);
	int a[10];

	input(a);
	printf("before\n");
	output(a);
	deal(a);
	printf("\nafter:\n");
	output(a);
	putchar('\n');
}

void input(int *a)
{
	int i;
	printf("input 10 numbers:\n");
	for(i=0;i<10;i++)
	{
		scanf("%d",&a[i]);
	}
}

void output(int *a)
{
	//putchar('\n');
	int i;
	for(i=0;i<10;i++)
		printf("%d ",a[i]);
}

void deal(int *a)
{
	int max,min,temp,i;
	int max_ord=0,min_ord=0;
	max=a[0];min=a[0];
	for(i=1;i<10;i++)
	{
		if(a[i]>a[max_ord]) max_ord=i;
		if(a[i]<a[min_ord]) min_ord=i;
	}
	
	temp=a[max_ord];
	a[max_ord]=a[9];
	a[9]=temp;

	temp=a[min_ord];
	a[min_ord]=a[0];
	a[0]=temp;
}

 

“算法耗时的实际测试”——以冒泡排序和快速排序为例

下面的代码演示了算法效率分析的事后统计方法,即算法耗时的实际测试方法。对于事前分析方法,小编会在本周内整理完毕。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef int KeyType;

typedef struct 
{
	KeyType key;
}DataType;

int main(int argc, char const *argv[])
{
	void BubbleSort(DataType a[],int n);
	void QuickSort(DataType a[],int low,int high);

	int i,n = 30000;
	double dif;
	time_t start,end;
	DataType test1[30000],test2[30000];

	for(i = 0; i < n; i++)
      //随机生成两组相同的测试数据
	{
		test1[i].key = rand();
		test2[i].key = test1[i].key;
	}

	time(&start);
	BubbleSort(test1,n);
	time(&end);
	dif = difftime(end,start);
	printf("BubbleSort:%.2fs\n",dif);

	time(&start);
	QuickSort(test2,0,n-1);
	time(&end);
	dif = difftime(end,start);
	printf("QuickSort:%.2fs\n",dif);

	return 0;
}

void BubbleSort(DataType a[],int n)
//冒泡排序算法,对 a[0]~a[n-1] 进行排序
{
	int i,j,flag = 1;
	DataType temp;
	for(i = 1; i < n && flag == 1; i++)
	{
		flag = 0;
		for(j = 0; j < n-i; j++)
		{
			if(a[j].key > a[j+1].key)
			{
				flag = 1;
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
	}
}

void QuickSort(DataType a[],int low,int high)
//快速排序算法,对 a[low]~a[high] 进行排序
{
	int i = low, j = high;
	DataType temp = a[low];  //取第一个数据元素为进行调整的标准数据元素

	while(i < j)             
	{
		while(i < j && temp.key <= a[j].key) j--;  //在数组的右端扫描
		if(i < j)
		{
			a[i] = a[j];
			i++;
		}

		while(i < j && a[i].key < temp.key) i++;  //在数组的左端扫描
		if(i < j)
		{
			a[j] = a[i];
			j--;
		}
	}
	a[i] = temp;

	if(low < i) QuickSort(a, low, i-1);                //对左端子集进行递归
	if(i < high) QuickSort(a, j+1, high);              //对右端子集进行递归
}

运行结果:

BubbleSort:7.00s

QuickSort:0.00s

说明:

快速排序耗时小于0.5秒,所以显示为0.00s

ran()函数的功能是生成随机数,在头文件 stdlib.h 中

difftime()函数以秒为单位计算时间差,在头文件 time.h 中

time()函数的功能是取系统的当前时间,在头文件 time.h 中

 

 

C语言中struct和typedef struct的区别

首先你萌能看到这篇总结笔记要感谢我们其中一位小编,他发现了这个容易让人纠结的地方。

在C语言中定义一个结构体变量有下面两种方法,读者依据注释仔细观察两种定义方法带来的区别:

struct Student
{
    int a;
}stu1;
struct Student stu2;
//上面的Student是结构体名,stu1和stu2是声明的两个结构体变量
//注意有两种声明的方法
typedef struct Student
{
    int a;
}Stu;
Student stu1;
//上面的Student是结构体名,Stu是别名(注意不是变量),即 Stu == struct Student
//stu1是声明的一个结构体变量

 

 

 

Windows 下配置 Sublime Text 3 C语言开发环境

Sublime Text 是一款让人又爱又恨的代码编辑器,在小编看来,它是做是最棒的代码编辑器,没有之一,不过它却也有让人几近抓狂的固执,比如官方论坛给出了 Linux 下中文输入法的解决方法但就是不在正式版中修复,还比如 C 语言开发环境对新手来说并不是那么容易配置。

在你们另一个小编的危逼利诱下,小编“巴黎不下雨”终于屈服,查阅大量资料去整理出了一个完美的解决方法,今天在这里无偿分享出来,方便另一个小编下次出事来查看ヽ(*·ω·)ノ也方便喜欢 Sublime Text 的童鞋自己手动配置。

1.安装gcc编译器,

默认gcc由WinGW(Minimalist GNU on Windows)提供,是要联网安装的,速度会比较慢,你们勤劳的小编把它离线打包了下,直接下载后解压到 C 盘根目录就可以了

[box style="download"]下载链接: http://pan.baidu.com/s/1gderJof 密码: zvf4[/box]

2.配置系统环境变量

右键 计算机 -> 属性 -> 高级 -> 环境变量,点击“系统变量”栏中的Path,编辑,添加 ;C:\MinGW\bin 注意开头有个分号

修改环境变量对了,标点都是英文标点也要注意下哦,小编发现好多人在用搜狗输入法,注意切换成英文状态

3.配置 Sublime Text 3

选择Tool -> Build System -> New Build System

配置Sublime Text 3输入以下代码:

{  
    "cmd"        : ["gcc","${file}", "-o", "${file_path}/${file_base_name}"],  
    "file_regex" :"^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",  
    "working_dir":"${file_path}",  
    "selector"   : "source.c",  
    "encoding"   : "cp936",  
  
    "variants"   :  
    [  
        {  
            "name"  : "Run",  
            "cmd"   : ["cmd","/c", "gcc", "${file}", "-o", "${file_path}/${file_base_name}","&&", "cmd", "/c","${file_path}/${file_base_name}"]  
        },  
        {  
            "name"  :"RunInCommand",  
            "cmd"   : ["cmd","/c", "gcc", "${file}", "-o","${file_path}/${file_base_name}", "&&","start", "cmd", "/c","${file_path}/${file_base_name} && pause"]  
        }  
    ]  
}

Ctrl+S 进行保存,默认保存的位置就是正确的(Sublime Text 3\Packages\User),文件名保存为 C.sublime-build

新建 Build System4.测试

先在 Tools -> Build System里面选择 C

快捷键:

Ctrl+B 是 Build

Ctrl+Shift+B 是 Run

5.补充,C++ 的配置

gcc虽然可以编译c++代码,但是不能进行c++的连接函数库操作。所以针对c++代码可以设置使用g++来编译。

方法和上面的一样,只要把配置文件中的gcc改为g++ ,source.c改为source.c++ ,保存文件名c.sublime-build改为c++.sublime-build就可以了。配置文件如下:

{
	"encoding": "utf-8",
	"working_dir": "$file_path",
	"shell_cmd": "g++ -Wall -std=c++0x $file_name -o $file_base_name && cmd /c ${file_path}/${file_base_name}",
	"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
	"selector": "source.c++",
 
	"variants": 
	[
		{	
		"name": "Run",
        	"shell_cmd": "g++ -Wall -std=c++0x $file -o $file_base_name && start cmd /c \"${file_path}/${file_base_name} & pause\""
		}
	]
}

6.进阶:关于 sublime.build

这个编译文件是JSON文件,遵循JSON的语法。JSON 数据的书写格式是:

“名称”: “值”   例如    “firstName” : “John”

支持的变量

只列举了用到的:

$file_path 当前文件所在目录路径, e.g., C:\Files.
$file 当前文件的详细路径, e.g., C:\Files\Chapter1.txt.
$file_name 文件全名(含扩展名), e.g., Chapter1.txt.
$file_extension 当前文件扩展名, e.g., txt.
$file_base_name 当前文件名(不包括扩展名), e.g., Document.

也可以使用花括号括起来

${project_name}

或者使用:设置默认值 这时候必须有花括号。

${project_name:Default}

 用到的名称:

working_dir:运行cmd是会先切换到working_dir指定的工作目录

cmd:包括命令及其参数。如果不指定绝对路径,外部程序会在你系统的:const:PATH 环境变量中搜索。

shell_cmd:相当于shell:true的cmd ,cmd可以通过shell运行。

file_regex:该选项用Perl的正则表达式来捕获构建系统的错误输出到sublime的窗口。

“selector”: “source.c” :在选定 Tools | Build System | Automatic 时根据这个自动选择编译系统。

variants 用来替代主构建系统的备选。例如Run命令。会显示在tool的命令中。

name: 只在variants下面有,设置命令的名称,例如Run 。

本篇文章部分资料来源于网络:

关于 sublime.build 的相关信息来自这里

Linux 中 Sublime Text 3 使用中文输入法

小编是个ST3重试依赖用户,已经达到了没有ST3就不想写代码的地步,可惜在 Linux 下 ST3 是不支持中文输入法的,这个问题在论坛上已经给出了解决方法,但是在升级中并没有修复。

目前只测试了 Ubuntu(包括衍生版)和 openSUSE,其他平台应该也能成功,如果有试用过的小伙伴欢迎来反馈。

1.安装依赖软件

sudo zypper install build-essential libgtk2.0-dev ##opensuse
sudo apt-get install build-essential libgtk2.0-dev ##ubuntu

2.新建一个空文件,保存以下代码

/*
 * sublime-imfix.c
 * Use LD_PRELOAD to interpose some function to fix sublime input method support for linux.
 * By Cjacker Huang <jianzhong.huang at i-soft.com.cn> *
 *
 * gcc -shared -o libsublime-imfix.so sublime_imfix.c  `pkg-config --libs --cflags gtk+-2.0` -fPIC
 * LD_PRELOAD=./libsublime-imfix.so sublime_text
 */
#include <gtk/gtk.h>
#include <gdk/gdkx.h>

typedef GdkSegment GdkRegionBox;

struct _GdkRegion
{
    long size;
    long numRects;
    GdkRegionBox *rects;
    GdkRegionBox extents;
};

GtkIMContext *local_context;

void
gdk_region_get_clipbox (const GdkRegion *region,
                      GdkRectangle    *rectangle)
{
    g_return_if_fail (region != NULL);
    g_return_if_fail (rectangle != NULL);

    rectangle->x = region->extents.x1;
    rectangle->y = region->extents.y1;
    rectangle->width = region->extents.x2 - region->extents.x1;
    rectangle->height = region->extents.y2 - region->extents.y1;
    GdkRectangle rect;
    rect.x = rectangle->x;
    rect.y = rectangle->y;
    rect.width = 0;
    rect.height = rectangle->height;

    //The caret width is 2;
    //Maybe sometimes we will make a mistake, but for most of the time, it should be the caret.
    if (rectangle->width == 2 && GTK_IS_IM_CONTEXT(local_context)) {
        gtk_im_context_set_cursor_location(local_context, rectangle);
    }
}

//this is needed, for example, if you input something in file dialog and return back the edit area
//context will lost, so here we set it again.

static GdkFilterReturn event_filter (GdkXEvent *xevent, GdkEvent *event, gpointer im_context)
{
    XEvent *xev = (XEvent *)xevent;

    if (xev->type == KeyRelease && GTK_IS_IM_CONTEXT(im_context)) {
        GdkWindow *win = g_object_get_data(G_OBJECT(im_context), "window");

        if (GDK_IS_WINDOW(win)) {
            gtk_im_context_set_client_window(im_context, win);
        }
    }

    return GDK_FILTER_CONTINUE;
}

void gtk_im_context_set_client_window (GtkIMContext *context,
                                       GdkWindow    *window)
{
    GtkIMContextClass *klass;
    g_return_if_fail (GTK_IS_IM_CONTEXT (context));
    klass = GTK_IM_CONTEXT_GET_CLASS (context);

    if (klass->set_client_window) {
        klass->set_client_window (context, window);
    }

    if (!GDK_IS_WINDOW (window)) {
        return;
    }

    g_object_set_data(G_OBJECT(context), "window", window);
    int width = gdk_window_get_width(window);
    int height = gdk_window_get_height(window);

    if (width != 0 && height != 0) {
        gtk_im_context_focus_in(context);
        local_context = context;
    }
    
    gdk_window_add_filter (window, event_filter, context);
}

3.编译文件,打开终端进入你保存文件的位置,使用以下命令:

gcc -shared -o libsublime-imfix.so sublime-imfix.c  `pkg-config --libs --cflags gtk+-2.0` -fPIC

4.拷贝文件

sudo cp libsublime-imfix.so /usr/lib/

5.修改文件

sudo vim /usr/share/applications/sublime_text.desktop

找到其中的Exec=/opt/sublime_text/sublime_text %F,将其修改为:

Exec=bash -c 'LD_PRELOAD=/usr/lib/libsublime-imfix.so /opt/sublime_text/sublime_text' %F