Linux编程学习笔记

我学习Linux编程的过程。从学习安装Linux开始,然后学习了几条命令行命令,接着启动Telnet服务等等。以下是具体过程。

>>>>Linux启动时不进入Xwindow,而是字符界面:

修改 /etc/inittab

id:5:initdefault:

id:3:initdefault:

>>>>配置Telnet

1、检查是否有安装包:

rpm -q telnet

rpm -q telnet-server

2、如果没有则需要安装:

rpm -i telnet-server-0.17-25i386.rpm

注意,可能有不同版本TelnetServer

3、运行ntsysvntsysv为系统中管理服务的程序,在Telnet前选择*

4service xinetd restart

5Telnet的配置文件在

/etc/xinetd.d/telnet

可以修改配置连接授权网段、域名、时间段等等。

6、默认情况下,Telnet不运行root权限登陆,如果确实需要,则修改:

vi /etc/pam.d/login

#auth required pam_securetty.so #

将上行加注释。

>>>>DOSLinux常用命令对应关系

------------------------------

copy cp

move mv

dir ls

cls clear

exit exit

date date

del rm

echo echo

edit vi

fc diff

find grep

format mformat

cmd /? man cmd

mkdir mkdir

more less

ren mv

chdir pwd

cd path cd path

cd .. cd ..

time date

mem free

>>>>用户管理命令

useradd name //加一个命令

passwd name //设置用户的口令

>>>>用户切换

su username

可以切换到root权限,但需要知道password

>>>>配置FTP Server

1、查询FTP Server

rpm -q vsftpd

2、启动FTP Server

/etc/rc.d/init.d/vsftpd start

相应有stoprestart等选项

3、也可以用上面配置Telnet的方法进行启动。

>>>>>Linux下的打包和压缩

常见文件名:.gz,.tar.gz,.tgz,.bz2,.Z,.tar

打包和压缩是两个不同概念,大包是一大堆文件打成一个文件,压缩是文件变小。

tar是常用的打包程序。

.tar

解包:tar xvf FileName.tar

打包:tar cvf FileName.tar DirName

(注:tar是打包,不是压缩!)

---------------------------------------------

.gz

解压1gunzip FileName.gz

解压2gzip -d FileName.gz

压缩:gzip FileName

.tar.gz .tgz

解压:tar zxvf FileName.tar.gz

压缩:tar zcvf FileName.tar.gz DirName

---------------------------------------------

.bz2

解压1bzip2 -d FileName.bz2

解压2bunzip2 FileName.bz2

压缩: bzip2 -z FileName

.tar.bz2

解压:tar jxvf FileName.tar.bz2

压缩:tar jcvf FileName.tar.bz2 DirName

---------------------------------------------

.bz

解压1bzip2 -d FileName.bz

解压2bunzip2 FileName.bz

压缩:未知

.tar.bz

解压:tar jxvf FileName.tar.bz

压缩:未知

---------------------------------------------

.Z

解压:uncompress FileName.Z

压缩:compress FileName

.tar.Z

解压:tar Zxvf FileName.tar.Z

压缩:tar Zcvf FileName.tar.Z DirName

---------------------------------------------

.zip

解压:unzip FileName.zip

压缩:zip FileName.zip DirName

---------------------------------------------

.rar

解压:rar x FileName.rar

压缩:rar a FileName.rar DirName

rar请到:http://www.rarsoft.com/download.htm 下载!

解压后请将rar_static拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):

[root@www2 tmp]# cp rar_static /usr/bin/rar

---------------------------------------------

.lha

解压:lha -e FileName.lha

压缩:lha -a FileName.lha FileName

lha请到:http://www.infor.kanazawa-it.ac.jp/~ishii/lhaunix/下载!

>解压后请将lha拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):

[root@www2 tmp]# cp lha /usr/bin/

---------------------------------------------

.rpm

解包:rpm2cpio FileName.rpm | cpio -div

---------------------------------------------

.deb

解包:ar p FileName.deb data.tar.gz | tar zxf -

---------------------------------------------

.tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh .lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea

解压:sEx x FileName.*

压缩:sEx a FileName.* FileName

sEx只是调用相关程序,本身并无压缩、解压功能,请注意!

sEx请到: http://sourceforge.net/projects/sex下载!

解压后请将sEx拷贝到/usr/bin目录

vi使用

退出 EscZZ 或者输入“:”,然后按Q。如果使用wq,则包括写入和退出。

Q!是不写入直接退出

Vi的关键是有两种状态,一种是“插入”状态,一种是“命令”状态。前一种状态,屏幕下面有“插入”的标识。另一种状态就是命令状态,执行任何命令,先输入一个“:”符号。然后再执行。

Linux开发入门

Red Hat9.0为开发平台

Linux操作系统内核底层的开发工具和辅助工具,有的是直接建立在内核基础上,如ShellGCCMake等;有的是建立在脚本语言的基础之上的,如AutomakeAutoconfLibtool等。它们是Linux操作系统外层的图形界面开发工具(GTK+QT等)和网络应用开发工具(PerlPHPPython等)的基础和过渡。

GCC

-o 输出可执行文件

-c 只输出目标代码

-g 编译时提供以后对程序进行调试的信息

make命令

Makefile是它的配置文件。

#开始为注释。

Makefile用于描述文件的依赖关系,第一行总是依赖关系,第二行是规则。

比如:

main:main.o mytool1.o mytool2.o

gcc -o main main.o mytool1.o mytool2.o

表明,目标main的依赖对象是main.omytool1.omytool2.o

下面一行是规则。注意规则前面有个TAB键。

因此,makefile的格式一般是:

target: components

TAB rule

makefile有三个有用的变量:

$@ 目标文件

$^ 所有依赖的文件

$< 第一个依赖文件

l Linux沿用Unix的习惯,称服务的应用程序为daemon

l Linux的目标是网络OSWindows的核心是所见即所得。

l 即使是纯文本,Linux同样拥有先进的网络、脚本和安全能力。

关于进程方面的编程

l 进程有五个状态:

新建、运行、阻塞、就绪和完成。

阻塞-进程正等待某一事情发生

就绪-等待CPU的执行命令

完成-系统正回收资源

l 进程有标志,即ID。下面代码掩饰获取进程ID的方法。

l Linux支持许多不同格式的可执行文件。ELF是一个,Java是另一个。

l 每个进程使用一个task_structLinuxtaskProcess互用)的数据结构来表示。

l 系统中最大进程数受到向量表task的限制。

l 系统用current指针指向当前正运行的进程。

l 所有进程都有父进程,这是一个Clone的过程。意义在于保证进程间的连接是严密的。Pstree命令用于查看这一父子孙的关系。

l 进程的根是init进程

l 系统按照组分配权限,一个进程可以同时属于多个组。

l 每一个进程同时拥有四对进程和组标识符:

Uidgid 进程所有者的ID

Effective uid , gid 进程为了获取资源,系统通过有效ID审核实际的权限。

File system uid , gid 和上面Eid差不多。

Saved uid , gid。- 进程执行后Eid等可能会改变,但Sid不会,他是最初的真实ID

下面是一段例子代码:

#include <sys/types.h>

#include <unistd.h>

#include <stdio.h>

#include <pwd.h>

int main(int argc , char ** argv)

{

pid_t my_pid;

pid_t parent_pid;

uid_t my_uid;

uid_t my_euid;

gid_t my_gid;

gid_t my_egid;

struct passwd * my_info;

my_pid = getpid();

parent_pid = getppid();

my_uid = getuid();

my_euid = geteuid();

my_gid = getgid();

my_egid = getegid();

my_info = getpwuid(my_uid);

printf("Process ID : %ld \n",my_pid);

printf("Parent ID : %ld \n",parent_pid);

printf("User ID : %ld \n",my_uid);

printf("Effective user ID : %ld \n",my_euid);

printf("Group ID : %ld \n",my_gid);

printf("Effective Group ID: %ld \n",my_egid);

if(my_info)

{

printf("My Login Name : %s \n",my_info->pw_name);

printf("My Password :%s\n" ,my_info->pw_passwd);

printf("My User ID :%ld\n",my_info->pw_uid);

printf("My Group ID :%ld\n",my_info->pw_gid);

printf("My Real Name:%s\n" ,my_info->pw_gecos);

printf("My Home Dir :%s\n", my_info->pw_dir);

printf("My Work Shell:%s\n", my_info->pw_shell);

}

}

关于fork()

用于父进程创建子进程。

进程ID和父进程ID是不同的。

因为Linux的多用户特性,因此需要父进程创建子进程。

一旦子进程被创建,父子进程就相互竞争系统资源。

如果希望子进程继续执行而父进程阻塞直到子进程完成,可以使用wait或者waitpid

Exec()

为了使用系统程序,可以使用exec族,一共有5个函数

execl

execlp

execle

execv

execvp

fork函数与普通函数的不同之处在于,函数如果调用成功,将返回两次。在父进程中返回子进程的PID,在子进程中返回0。如果调用不成功,则返回0

下面是一段例子代码:

#include "stdio.h"

#include "sys/types.h"

#include "unistd.h"

#include "string.h"

#include "math.h"

#include "sys/wait.h"

#include "errno.h"

void main(void)

{

pid_t child;

int status;

int i;

printf("This will demostrate how to get child status\n");

if( (child = fork()) == -1)

{

printf("Fork Error :%s\n",strerror(errno));

exit(i);

}

else

{

if( child == 0 )

{

int i;

printf("I am the child: %ld\n",getpid());

for(i = 0;i < 1000000;i ++)

sin(i);

i = 5;

printf("I exit with %d\n",i);

exit(i);

}

}

// while( ((child == wait(&status)) == -1)

sleep(1);

child = wait(&status);

printf("child's pid = %d . exit status = %d \n",getpid(),WEXITSTATUS(status));

}

//使用数学函数,编译时要加-lm选项。

守护进程

也就是后台程序。可以在命令后面加入“&”符号即可使程序运行于后台。

编写思想:父进程创建子进程,子进程杀死父进程。

#include "stdio.h"

#include "sys/types.h"

#include "unistd.h"

#include "string.h"

#include "sys/wait.h"

#include "errno.h"

void main(void)

{

pid_t child;

int status;

if( (child = fork()) == -1)

{

printf("Fork Error:%s \n",strerror(errno));

exit(1);

}

else

{

if(child > 0)

{

while(1)

{

if(kill(getppid(),SIGTERM) == -1)

{

printf("Kill Parent Error:%s\n",strerror(errno));

exit(1);

}

while(1)

{

printf("some codes\n");

sleep(10);

} } } }

}

= 未完待续 =

Linux学习笔记续

你可能感兴趣的:(编程,linux,网络应用,配置管理,qt)