我学习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、运行ntsysv,ntsysv为系统中管理服务的程序,在Telnet前选择*。
4、service xinetd restart
5、Telnet的配置文件在
/etc/xinetd.d/telnet
可以修改配置连接授权网段、域名、时间段等等。
6、默认情况下,Telnet不运行root权限登陆,如果确实需要,则修改:
vi /etc/pam.d/login
#auth required pam_securetty.so #
将上行加注释。
------------------------------
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
1、查询FTP Server
rpm -q vsftpd
2、启动FTP Server
/etc/rc.d/init.d/vsftpd start
相应有stop,restart等选项
3、也可以用上面配置Telnet的方法进行启动。
>>>>>Linux下的打包和压缩
常见文件名:.gz,.tar.gz,.tgz,.bz2,.Z,.tar
打包和压缩是两个不同概念,大包是一大堆文件打成一个文件,压缩是文件变小。
tar是常用的打包程序。
.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
---------------------------------------------
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
---------------------------------------------
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
---------------------------------------------
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 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使用
退出 - Esc,ZZ。 或者输入“:”,然后按Q。如果使用wq,则包括写入和退出。
Q!是不写入直接退出
Vi的关键是有两种状态,一种是“插入”状态,一种是“命令”状态。前一种状态,屏幕下面有“插入”的标识。另一种状态就是命令状态,执行任何命令,先输入一个“:”符号。然后再执行。
以Red Hat9.0为开发平台
Linux操作系统内核底层的开发工具和辅助工具,有的是直接建立在内核基础上,如Shell、GCC和Make等;有的是建立在脚本语言的基础之上的,如Automake、Autoconf和Libtool等。它们是Linux操作系统外层的图形界面开发工具(GTK+、QT等)和网络应用开发工具(Perl、PHP和Python等)的基础和过渡。
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.o,mytool1.o和mytool2.o。
下面一行是规则。注意规则前面有个TAB键。
因此,makefile的格式一般是:
target: components
TAB rule
makefile有三个有用的变量:
$@ 目标文件
$^ 所有依赖的文件
$< 第一个依赖文件
l Linux沿用Unix的习惯,称服务的应用程序为daemon。
l Linux的目标是网络OS,Windows的核心是所见即所得。
l 即使是纯文本,Linux同样拥有先进的网络、脚本和安全能力。
l 进程有五个状态:
新建、运行、阻塞、就绪和完成。
阻塞-进程正等待某一事情发生
就绪-等待CPU的执行命令
完成-系统正回收资源
l 进程有标志,即ID。下面代码掩饰获取进程ID的方法。
l Linux支持许多不同格式的可执行文件。ELF是一个,Java是另一个。
l 每个进程使用一个task_struct(Linux中task和Process互用)的数据结构来表示。
l 系统中最大进程数受到向量表task的限制。
l 系统用current指针指向当前正运行的进程。
l 所有进程都有父进程,这是一个Clone的过程。意义在于保证进程间的连接是严密的。Pstree命令用于查看这一父子孙的关系。
l 进程的根是init进程
l 系统按照组分配权限,一个进程可以同时属于多个组。
l 每一个进程同时拥有四对进程和组标识符:
Uid,gid - 进程所有者的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);
}
}
用于父进程创建子进程。
进程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);
} } } }
}
= 未完待续 =