posts - 25, comments - 7, trackbacks - 0, articles - 0

     摘要:   阅读全文

posted @ 2007-10-17 21:06 谢龙飞 阅读(197) | 评论 (0)编辑 收藏

一个进程的 real user ID 是指运行此进程的用户角色的 ID。
一个进程的 effective user ID 是指此进程目前实际有效的用户 ID(也就是权限的大小),effective user ID 主要用来校验权限时使用,比如打开文件、创建文件、修改文件、kill 别的进程,等等。
如果一个进程是以 root 身份来运行的,那么上面这两个 ID 可以用 setuid/seteuid 随便修改,想怎么改就怎么改,改来改去都可以。
但是如果一个进程是以普通用户身份来运行的,那么上面这两个 ID 一般来说是相同的,并且也不能随便修改。只有一种情况例外:此进程的可执行文件的权限标记中,设置了“设置用户 ID”位!
在命令行中,设置一个可执行文件的“设置用户 ID”位的最简单的方法,就是用
chmod +s /path/to/file

这个命令。
一旦用了这个命令之后,再执行这个文件,
那么生成的进程的 effective user ID 就变成了这个可执行文件的 owner user ID(属主用户 ID),
而 real user ID 仍然是启动这个程序时所用的用户的 ID。
打个比方来说,如果有这样的一个文件:
引用:-rw[color=red]s[/color]r-[color=red]s[/color]r-x 1 susesuse susesuse 7902 2006-08-31 13:22 tuid

注意这个文件已经用 chmod +s 命令设置过“设置用户 ID”位了。
然后我用 flw 这个用户来执行它,那么生成的进程它的 real user ID 就是 flw(因为我是用 flw 运行的),但是 effective user ID 就变成了 susesuse(因为这个可执行文件被设置了“设置用户 ID”位,并且它的 owner user ID 是 susesuse)。
这时,这个进程实际上就有两个用户权限了。只不过目前生效的是 susesuse,因此它目前能够且只能够操作 susesuse 用户的文件,如果现在我又想要操作 flw 用户的文件怎么办?
很简单,只需要 seteuid( getuid() ) 就可以了。执行完这句之后,effective user ID 就变成和 real user ID 一样了,都变成 flw 了。

可是如果过了一会儿我又想要变回来怎么办?因为 effective user ID 和 real user ID 此时都变成了 flw 了,所以操作系统必须得有一个地方保存住原来的“设置用户 ID”(也就是可执行文件的 owner user ID),不然等你再想要 seteuid 的时候,操作系统就不知道你有没有那个权利了。(总不能再去访问一次文件系统吧?那样也太没有效率了)

操作系统为了能够在设置了 seteuid 之后,再次设置回来,所以特地将原来的“设置用户 ID”保存下来了,这个保存下来的设置用户 ID 自然就叫做“保存的设置用户 ID”。

下面看一段写的例子程序:
flw@Sleeper:~$ whoami

flw
flw@Sleeper:~$ cat tuid.c
# include <stdio.h>
# include <sys/types.h>
# include <pwd.h>

int main( void )
{
    struct passwd *pwd;

    pwd = getpwuid( geteuid() );
    printf( "effective UID: [%s]\n", pwd->pw_name );

    system( "touch /tmp/foo.txt; ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt" );

    printf( "\nset EUID to `flw'..\n" );
    pwd = getpwnam( "flw" );
    seteuid(pwd->pw_uid);

    pwd = getpwuid( geteuid() );
    printf( "effective UID: [%s]\n", pwd->pw_name );

    system( "touch /tmp/foo.txt; ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt" );

    printf( "\nset EUID to `root'..\n" );
    seteuid(0);

    pwd = getpwuid( geteuid() );
    printf( "effective UID: [%s]\n", pwd->pw_name );

    system( "touch /tmp/foo.txt; ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt" );

    return 0;
}
flw@Sleeper:~$ su root -c "cc -o tuid tuid.c; chmod +s tuid; ls -al tuid"
Password:
-rwsr-sr-x 1 root root 7902 2006-08-31 13:55 tuid
flw@Sleeper:~$ ./tuid
effective UID: [root]
-rw-r--r-- 1 root root 0 2006-08-31 13:55 /tmp/foo.txt

set EUID to `flw'..
effective UID: [flw]
-rw-r--r-- 1 flw root 0 2006-08-31 13:55 /tmp/foo.txt

set EUID to `root'..
effective UID: [root]
-rw-r--r-- 1 root root 0 2006-08-31 13:55 /tmp/foo.txt
flw@Sleeper:~$

posted @ 2007-10-15 23:05 谢龙飞 阅读(1109) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-10-13 20:18 谢龙飞 阅读(282) | 评论 (0)编辑 收藏

今天 调试一个020的数据处理程序碰到了一个问题,虽然已经解决,但是还是有点不明白,先记录在这里,以后有空的时候再好好 细细地想一下
我的原代码如下:
#include <C8051f020.h>

#define SYS_CLK 22118400

typedef struct                      //存储结构体
{
  unsigned char AD[93];                //2543的AD数据
  unsigned char shi;               //gprs的数据
  unsigned char fen;
  unsigned char miao;
  unsigned long jingdu_zheng;
  unsigned long jingdu_xiao;
  unsigned long weidu_zheng;
  unsigned long weidu_xiao;
  unsigned char sudu_zheng;
  unsigned char sudu_xiao;
}ram;

typedef struct                        //定义一个存储地址结构体
{
  unsigned char  adr_suocun;          //锁存的8位地址
  unsigned char  dptr_gao;        //dptr
  unsigned char  dptr_di;
 
}ADR_struct; 

void sysclk_Init(void);
void dog_Init(void);
void port_Init(void);
void cunchu_Init(void);
void cunchu_Init1(void);
void ram_init(unsigned char ADR);
void save_struct(ram a);
ram read_struct(void);

sbit AHH  = P1^0;         //用通用I/O来控制访问地址
sbit LB   = P1^1;
sbit UB   = P1^2; 
sbit ALE  = P0^5;

ADR_struct  dui_shou;     //存储队首地址
ADR_struct  dui_wei;      //存储队尾地址
    

void main()
{
  unsigned char i;
  ram a;
  sysclk_Init();
  dog_Init();
  cunchu_Init();
  port_Init();
  UB   = 1;
  LB   = 0;
  dui_wei.adr_suocun=0;          //锁存的8位地址
  dui_wei.dptr_gao=0x08;        //dptr
  dui_wei.dptr_di=0;

 
  for(i=0;i<93;i++)
   a.AD[i]=i;
  a.shi = 2;
  a.fen = 2;
  a.miao= 2;
  a.jingdu_zheng= 2;
  a.jingdu_xiao=2;
  a.weidu_zheng=2;
  a.weidu_xiao=2;
  a.sudu_zheng=2;
  a.sudu_xiao=2;

  for(i=0;i<17;i++)
    save_struct(a);
  
 
}

void ram_init(unsigned char ADR)   //ADR为要锁存的A8-A15 LU_B为 字节高低选择位为0 输出抵字节位 为1输出高字节位
{
  unsigned char i;
  AHH = 1;
  for(i=0;i<50;i++);     //等待稳定
  P3   = ADR;             //ADR为全局变量 选择存储块
  for(i=0;i<50;i++);     //等待稳定
  AHH  = 0;                   //注意 每一个LU_B ADR组合 对应4K的地址空间 每次换“块”的时候均需先调用此函数

}

 

 

void save_struct(ram a)         //将a存储到FIFO 队尾
{
 
  ram xdata *p;
  unsigned int i;
  cunchu_Init();
  ram_init(dui_wei.adr_suocun); //按队尾地址结构体中的suocun初始化sram
  dui_wei.dptr_gao<<=8;
  p  = dui_wei.dptr_gao+dui_wei.dptr_di;
  *p = a;                       //存储a到队尾
 
                               
//以下代码为队尾地址变换
  if((dui_wei.dptr_di==0x91)&&(dui_wei.dptr_gao==0x17)&&(dui_wei.adr_suocun==0xff)&&(UB ==0))     
//存储空间已经用完 地址循环至最低地址
  {                                                                             //此时最后一块内存 刚好存储1937个字节                      
    dui_wei.dptr_gao = 0x08;                                                    //dptr_di==1001 0001 dptr_gao==&&000 10 111
    dui_wei.dptr_di = 0x00;                                                     //suocun已经满ff UB为有效
 dui_wei.adr_suocun = 0;
 UB = !UB;
 LB = !LB;
  }
  else
  {
    if((dui_wei.dptr_gao<<8)+dui_wei.dptr_di<=(1937-114))                      //2k空间最多只能存储17帧即:1937个字节
    { 
   p=(dui_wei.dptr_gao<<8)+dui_wei.dptr_di+114;                      //每帧数据长114个字节 dptr值加上114;
      dui_wei.dptr_di  = (unsigned char)p;
      i = p;
   dui_wei.dptr_gao =i>>8;

    }
    else                                           //2k空间已经用完dptr=1937=0000111 10010001时 移动到下一个2k块 切换
    {
   if(dui_wei.dptr_gao==0x0f)                   //将高八位从000 01 111 切换成 000 10 000 低八位全清零
   {
     dui_wei.dptr_di=0;
        dui_wei.dptr_gao ^=0x1f;
   }
   else if(dui_wei.dptr_gao==0x17)              //将高八位从000 10 111 切换成 000 01 000 低八位全清零
   {                                            //并触发adr_suocun + 1
     dui_wei.dptr_di=0;
  dui_wei.dptr_gao ^=0x1f;
  
//以下为adr_suocun + 1处理代码                                                                   
     if(dui_wei.adr_suocun==0xff)                 //adr_suocun + 1过程中 要判断是否需要切换高低字节 用完低字节后 再用高字节
     {
       LB = !LB;
       UB = !UB;
    dui_wei.dptr_di  = 0;
    dui_wei.dptr_gao = 0x08;                  //将高八位切换成000 01 000 低八位清零
    dui_wei.adr_suocun=0;
        }
     else                                         //未用完 不切换
     { 
          dui_wei.dptr_di = 0;                     //将高八位切换成000 01 000 低八位清零
    dui_wei.dptr_gao = 0x08;                   
          dui_wei.adr_suocun++;
       }
      }
 /*     if(dui_wei==dui_shou)                           //如果存储速度大于读取速度 则覆盖最旧的数据
      {                                               //使得队首 向后移动一个 帧 从而丢弃最旧的数据帧
        adr_add_change;
      }*/
    }
  }
   
}
 

void sysclk_Init(void)   //系统时钟初始化
{
  int i;
  OSCXCN = 0x67;                    //启动外部11.0592MHz震荡器
  for(i = 0;i<255;i++);            //等待外部晶体起振
  while((OSCXCN & 0x80)==0x00);  //查询标志位 以判断外部时钟是否稳定
  OSCICN = 0x88;                 //使用外部震荡器做系统时钟并使能时钟丢失检测          
  CKCON = 0x10;       //初始化T1时钟为系统时钟
}

void dog_Init(void)      //看门狗设置为:关闭
{
  EA    =  0;
  WDTCN =  0xde;
  WDTCN =  0xad;
  EA    =  1;
}
void port_Init(void)     //端口分配与输入输出方式
{
  XBR2      =  0x44;        //使能交叉开关和全局弱上拉 配置UART1引脚,外部存储器接口配置到低端口
  XBR0      =  0x04;       //配置UARTO引脚
  XBR1      =  0x00;        
  P0MDOUT   =  0xf5;        //UART的RX引脚总被配置成开漏输出 TX引脚为推拉输出 RD WR ALE 2543EOC均为推拉输出
  P3MDOUT    =  0xff;       //DT0-DT7
 
}


void cunchu_Init(void)
{
  EMI0CF = 0x0c;          //配置外部存储器为复用方式 只使用片外XRAM ALE脉宽为一个系统时钟周期
  EMI0TC = 0x6d;          //配置外部存储器的接口时序
 
}                        

void cunchu_Init1(void)
{
  EMI0CF = 0x10;
  EMI0TC = 0x6d;
}

在build的时候老出现如下错误:

segment does not fit

刚开始知道是内部ram超限了

但是将 ram a 改成 xdata ram a
还是有问题

直到再将 全局变量
ADR_struct  dui_shou;     //存储队首地址
ADR_struct  dui_wei;      //存储队尾地址

改成
ADR_struct  idata dui_shou;     //存储队首地址
ADR_struct  idata dui_wei;      //存储队尾地址

才解决错误

有时间好好考虑下 感觉 全局变量 是个关键

posted @ 2007-10-08 16:46 谢龙飞 阅读(339) | 评论 (0)编辑 收藏

     摘要: 开学以来的学习情况 总结  阅读全文

posted @ 2007-10-06 22:06 谢龙飞 阅读(1257) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-10-06 19:24 谢龙飞 阅读(1966) | 评论 (2)编辑 收藏

     摘要:   阅读全文

posted @ 2007-10-06 19:23 谢龙飞 阅读(270) | 评论 (0)编辑 收藏

tar -I或者bunzip2命令都可以解压.bz2文件

tar xvfj example.tar.bz2

tar xvfz example.tar.gz

tar xvfz example.tgz

tar xvf example.tar

unzip example.zip

tar -jvxf some.bz,就是把tar的zvxf 改成jvxf

zip/tar rh8下有一个图形界面的软件file-roller可以做这件事。另外可以用unzip *.zip解开zip文件,unrar *.rar解开rar文件,不过unrar一般系统不自带,要到网上下载。

# rpm2cpio example.rpm │ cpio -div

# ar p example.deb data.tar.gz | tar zxf -

Alien 提供了.tgz, .rpm, .slp和.deb等压缩格式之间的相互转换: sourceforge.net/projects/alien sEx提供了几乎所有可见的压缩格式的解压接口:sourceforge.net/projects/sex 0058 在多级目录中查找某个文件的方法(青海湖)

find /dir -name filename.ext

du -a | grep filename.ext

locate filename.ext

posted @ 2007-10-02 20:22 谢龙飞 阅读(248) | 评论 (0)编辑 收藏

Linux下软件安装方法总结

关键词Linux    tar    安装软件    rpm    apt                                          

Linux下软件安装方法总结:

一、rpm包安装方式步骤:
1、找到相应的软件包,比如soft.version.rpm,下载到本机某个目录;
2、打开一个终端,su -成root用户;
3、cd soft.version.rpm所在的目录;
4、输入rpm -ivh soft.version.rpm

二、deb包安装方式步骤:
1、找到相应的软件包,比如soft.version.deb,下载到本机某个目录;
2、打开一个终端,su -成root用户;
3、cd soft.version.deb所在的目录;
4、输入dpkg -i soft.version.deb

三、tar.gz源代码包安装方式:
1、找到相应的软件包,比如soft.tar.gz,下载到本机某个目录;
2、打开一个终端,su -成root用户;
3、cd soft.tar.gz所在的目录;
4、tar -xzvf soft.tar.gz //一般会生成一个soft目录
5、cd soft
6、./configure
7、make
8、make install

四、tar.bz2源代码包安装方式:
1、找到相应的软件包,比如soft.tar.bz2,下载到本机某个目录;
2、打开一个终端,su -成root用户;
3、cd soft.tar.bz2所在的目录;
4、tar -xjvf soft.tar.bz2 //一般会生成一个soft目录
5、cd soft
6、./configure
7、make
8、make install

五、apt方式安装:
1、打开一个终端,su -成root用户;
2、apt-cache search soft 注:soft是你要找的软件的名称或相关信息
3、如果2中找到了软件soft.version,则用apt-get install soft.version命令安装软件 注:只要你可以上网,只需要用apt-cache search查找软件,用apt-get install软件

六、bin文件安装:
如果你下载到的软件名是soft.bin,一般情况下是个可执行文件,安装方法如下:
1、打开一个终端,su -成root用户;
2、chmod +x soft.bin
3、./soft.bin //运行这个命令就可以安装软件了

/************关于本文档********************************************
*filename:Linux下软件安装方法总结
*purpose:总结了Linux下各种软件安装方法
*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言编程
*date time:2006-07-26 18:10:00
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循GPL。
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
*********************************************************************/

七、不需要安装的软件:
有了些软件,比如lumaqq,是不需要安装的,自带jre解压缩后可直接运行。假设下载的是lumaqq.tar.gz,使用方法如下:
1、打开一个终端,su -成root用户;
2、tar -xzvf lumaqq.tar.gz //这一步会生成一个叫LumaQQ的目录
3、cd LumaQQ
4、chmod +x lumaqq //设置lumaqq这个程序文件为可运行
5、此时就可以运行lumaqq了,用命令./lumaqq即可,但每次运行要输入全路径或切换到刚才生成的LumaQQ目录里
6、为了保证不设置路径就可以用,你可以在/bin目录下建立一个lumaqq的链接,用命令ln -s lumaqq /bin/ 即可,以后任何时候打开一个终端输入lumaqq就可以启动QQ聊天软件了
7、 如果你要想lumaqq有个菜单项,使用菜单编辑工具,比如Alacarte Menu Editor,找到上面生成的LumaQQ目录里的lumaqq设置一个菜单项就可以了,当然你也可以直接到 /usr/share/applications目录,按照里面其它*.desktop文件的格式生成一个自己的desktop文件即可。

建议开发者们不要用red hat/red flag/suse等第一代Linux操作系统,用这些除了方便(也就是说比较傻瓜型)、界面豪华点外没什么好。用debian/ubuntu等第二代 吧,apt命令安装软件是最简单的。apt命令会自动解决软件安装过程中的依赖问题,会把没有的包安装上,会把版本低的包自动升级,当然,都是要经你确认 一次的。
如果你使用Red Hat等第1代Linux系统,安装软件是比较麻烦的事,rpm -ivh softA.rpm是用来安装softA软件的,但通常情况下可能遇到的问题是提示说需要安装softB1, softB2, softB3等一堆软件,然后你安装softB1软件包时,可能又会提示你说需要安装softC1, softC2, softC3, softC4等一堆软件……这样一来你就只够时间到处去找这些软件包了。光盘上没有就得去网上下载,网上还得搜索半天,时间都花在搜索软件包了。而且就算 找到这些软件包,还可能会遇到的问题是:softC2软件包必须在softC1软件包之前安装才可以,顺序错了也安装不成功。但这谁知道呢?难啊。所以, 你没有时间来安装体验软件的功能了,更别说开发软件了。
建议你安装第2代Linux操作系统,典型的是Debian Linux和Ubuntu Linux,我之前在文章“如何在安装了Windows操作系统的电脑上安装Linux操作系统”里提到一个简明安装手册,你下载来照着操作就可以安装Ubuntu了。
第2代操作系统在安装软件方面相当简单:第一步,搜索你要的软件,比如你要找一个游戏软件,它的名称叫myward,这个游戏软件的说明是:my own war game。搜索这个软件包就只需要输入命令apt-cache search myward,或者输入软件名称的一部分apt-cache search war,或者你不知道软件名称,输入软件说明里的一部分文字apt-cache search game,都可以找到这个软件,找到后进行第二步,只需要输入apt-get install myward,即后面跟上软件名称就可以安装了。

posted @ 2007-09-30 21:50 谢龙飞 阅读(209) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-09-26 22:12 谢龙飞 阅读(448) | 评论 (0)编辑 收藏

仅列出标题
共3页: 1 2 3