Archive for the ‘Programming’ Category.

linux环境编程之进程间通信(pipe & FIFO)

/***********************rw.h*******************/
#include <unistd.h>

int Read(int fd, void *buf,size_t count)
{
void *p =buf;
int totle = count;
int current = 0;
int iRet = 0;

while(current < totle)
{
iRet = read(fd,p + current,totle – current);
if(iRet < 0)
{
perror(“Read Error”);
return -1;
}
else if(iRet == 0)
{
return current;

}
else
{
current += iRet;
}
}
return current;

}

int Write(int fd,void *buf,size_t count)

{
void *p = buf;
int totle = count;
int current = 0;
int iRet = 0;

while(current < totle)
{
iRet = write(fd,p + current,totle – current);
if(iRet < 0)
{
perror(“Write Error”);
return -1;
}
else if(iRet == 0)
{
return current;
}
else
{
current += iRet;
}
}
return current;
}

/********************************************************
* name : pipe_print.c
* author : cyher
* date :2008-8-5
* descirption : 两个进程,父进程和子进程。
*               建立pipe父进程读取文件名给子进程读文件给父进程。
*               父进程打印在屏幕上。
* ********************************************************/

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include “rw.h”//读管道的时候需要用这个自己写的read循环读,否则一次可能读不全
#define MAX 1024
int main (int argc,char *argv[])
{
int fd1[2];
int fd2[2];
int pipe1,pipe2;
size_t n=1;
pid_t pid;
char buf1[MAX] = {0};
char buf2[MAX] = {0};
char buf3[MAX] = {0};
int fd;
ssize_t read_num;
if(argc != 2)
{
printf(“usage:\”pipe_print name\n\”");
exit(0);
}
if((pipe1=pipe(fd1)) == -1 )//父向子传信息的管道
{
perror(“pipe1″);
exit(1);
}

if((pipe2=pipe(fd2)) == -1)//子向父传信息的管道
{
perror(“pipe2″);
exit(1);
}

if((pid=fork()) < 0)
{
perror(“fork”);
exit(1);
}
else if(pid == 0)//子进程
{
close(fd1[1]);/*关管道1写端*/
close(fd2[0]);/*关管道2读端*/
sleep(1);
if(read(fd1[0],buf2,MAX) == -1)/*读取父进程传来的文件名*/
{
exit(1);
}
if(( fd = open(buf2,O_RDONLY,0) ) < 0)/*打开文件*/
{
perror(“open error”);
exit(1);
}

while(Read(fd,buf1,MAX) > 0)/*读文件放入buf1*/
{
Write(fd2[1],buf1,MAX);/*写入管道2*/
memset(buf1,0,MAX);/*清空buf1以免出错*/
}
close(fd1[0]);
close(fd2[1]);
exit(0);
}
else//父进程
{

close(fd2[1]);/*关管道2的写端*/
close(fd1[0]);/*关管道1的读端*/
n=strlen(argv[1]);
if(Write(fd1[1],argv[1],n) == -1)/*把命令行参数发给管道1*/
{
exit(1);
}
while((read_num=Read(fd2[0],buf3,MAX)) > 0 )/*读取管道2中的信息放在buf3中*/
{
if(read_num == -1)
{
perror(“read”);
exit(1);
}

if(Write(1,buf3,MAX) < 0)/*把buf3中的信息写在表准输出上*/
{
perror(“write”);
exit(1);
}
memset(buf3,0,MAX);/*清空buf3以免出错*/
}
putchar(‘\n’);
close(fd1[1]);
close(fd2[0]);
if(waitpid(pid,NULL,0) == -1)/*父进程等待子进程关闭回收子进程资源*/
{
perror(“wait”);
exit(1);
}
}
}

/********************************************************
* name : fifo.c
* author : cyher
* date :2008-8-5
* descirption : 两个进程,父进程和子进程
*               建立FIFO父进程读取文件名传给子进程读取文件传回父进程
*               父进程再打印在屏幕上
* ********************************************************/

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include “rw.h”
#define MAX 1024
int main (int argc,char *argv[])
{
int fd1,fd2,fd3,fd4;
int fifo,fifo2;
size_t n=1;
pid_t pid;
char buf1[MAX] = {0};
char buf2[MAX] = {0};
char buf3[MAX] = {0};
int fd;
ssize_t read_num;
if(argc != 2)
{
printf(“usage:\”pipe_print name\n\”");
exit(0);
}
if((fifo=mkfifo(“/tmp/cyher088″,0777)) == -1)
{
perror(“fifo”);
exit(1);

}
if((fifo2=mkfifo(“/tmp/cyher089″,0777)) == -1)
{
perror(“fifo”);
exit(1);

}
if((pid=fork()) < 0)
{
perror(“fork”);
exit(1);
}
else if(pid == 0)//子进程
{
if( ( fd1 = open(“/tmp/cyher088″,O_RDONLY,0666) ) == -1)
{
perror(“open1″);
exit(1);
}
sleep(1);
if(read(fd1,buf2,MAX) == -1)
{
perror(“read”);
exit(1);
}
if(( fd = open(buf2,O_RDONLY,0) ) < 0)
{
perror(“open error”);
exit(1);
}
if( ( fd4 = open(“/tmp/cyher089″,O_WRONLY ,0666) ) == -1)
{
perror(“open1″);
exit(1);
}

while(Read(fd,buf1,MAX) > 0)
{
Write(fd4,buf1,MAX);
memset(buf1,0,MAX);
}
close(fd1);
close(fd4);
exit(0);
}
else//父进程
{

if( ( fd3 = open(“/tmp/cyher088″,O_WRONLY ,0666) ) == -1)
{
perror(“open1″);
exit(1);
}
n=strlen(argv[1]);
if(Write(fd3,argv[1],n) == -1)
{
exit(1);
}
if( ( fd2 = open(“/tmp/cyher089″,O_RDONLY,0666) ) == -1)
{
perror(“open1″);
exit(1);
}
while((read_num=Read(fd2,buf3,MAX)) > 0 )
{
if(read_num == -1)
{
perror(“read”);
exit(1);
}

if(Write(1,buf3,MAX) < 0)
{
perror(“write”);
exit(1);
}
memset(buf3,0,MAX);
}
putchar(‘\n’);
close(fd3);
close(fd2);
if(waitpid(pid,NULL,0) == -1)
{
perror(“wait”);
exit(1);
}
}
}

相关日志

linux环境编程之文件操作(标准I/O)

下面一切皆文件这个概念因该深入 程序员或者将要成为 程序员的人心中。所以在下面对文件的操作是很重要的,下面是我做的一个例程用的是标准 I/O
对配置文件的改写是写程序很重要的一点,但是改写一个文件的时候,我们没有办法像用vi或者word那样直接插入就行了,因为,就算是word 或者vi他们都是把文件copy出来一个副本,然后你该然后再改名放回去,这基本上就是我理解的原理,所以代码也体现了这个原理,用标准I/O来做

/***********************************************/

/* name:changeini.c
* author:cyher
* date :2008-7-25
* description:change a line in ss.ini
* */
#include
#include
#include
#define MAX 100
int main(int argc,char *argv[])
{
char ch[MAX]={0};
char insert[]=”cgihome”;
char *p=ch;
FILE *fp1 = fopen(“ss.ini”,”r”);//直读打开ss.ini
if(fp1 == NULL)
{
printf(“er1″);
exit(1);
}
FILE *fp2 = fopen(“ss.ini.bak”,”wa+”);//截断打开ss.ini.bak
if(fp2 == NULL)
{
printf(“er2″);
exit(1);
}
/*
*从ss.ini中一行一行读数据判断是否是要插入的行的上一行
*/
while(fgets(p,MAX,fp1))
{
fputs(p,fp2);
fflush(NULL);
ch[7]=’\0′; //截断字符串,取前7个字符作为字符串
if(!strcmp(p,insert))//如果要找的字符串出现
{
fputs(“name = serverName\n”,fp2);//插入这句
}
}
fclose(fp1);
fclose(fp2);//关闭文件指针
/*这里应该有一个把ss.ini删去,把ss.ini.bak改名为ss.ini的功能*/
}

相关日志

重新拾起c# 写点小东西玩玩,“浏览记录清理&启动项管理”

信息安全实验课题

             ——上网痕迹清除

1.实验目的及要求:

   上网痕迹自动清除、显示系统自启动项并能实现清除。

说明:实现一个软件,类似优化大师的部分功能,首先要列举出上网的过程中都会在系统中留下哪些痕迹,系统都包含哪些自启动项,然后能对指定的上网痕迹和指定的自启动项进行清除。

2. 实验环境:

   开发平台:WindowsXP sp2 中文版,framework2.0

开发工具:visual studio 2005.NET

开发语言:c#

3. 实验内容:

   1.上网浏览痕迹的类型:

上网历史

C:\Documents and Settings\ Username \Local Settings\History

上网保存在系统缓存中的网页

C:\Documents and Settings\cyher\Local Settings\Temporary Internet Files

Ie自动保存的密码

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage2

Ie6是HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\spw

Ie自动完成的表单资料

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage1

Windows的临时文件夹

C:\Documents and Settings\Username\Local Settings\Temp

C:\WINDOWS\Temp

开始菜单中的文档记录

C:\Documents and Settings\Username\Recent

上网产生的cookies  

C:\Documents and Settings\Username\Cookies

Ie地址栏下拉菜单

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs

上 面的内容从原理上分,其中上网历史记录,上网保存在系统缓存中的网页,Windows的临时文件夹,开始菜单中的文档记录,上网产生的cookies这几 项都是缓存在Windows的特别文件夹中的。而Ie自动保存的密码,Ie地址栏下拉菜单,Ie自动完成的表单资料是在注册表中存放。

基本原理就是删除不想要的文件和注册表项就可以了。

所以,用c#编写的时候基本上就是两个类 一个DeleteFolder删除文件夹和文件,一个 DeleteKey删除注册表项。

public void DeleteFolder(string dir)

        {

            try

            {

                if (Directory.Exists(dir))   //如果存在这个文件夹删除之   

                {

                    foreach (string d in Directory.GetFileSystemEntries(dir))

                    {

                        string a = Path.GetExtension(d).ToString();

                        //if (d == dir+”\\index.dat“)

                        if (a == “.dat”)

                            continue;

                        else

                        {

                            if (File.Exists(d))

                                File.Delete(d);    //直接删除其中的文件   

                            else

                                DeleteFolder(d);

                        }//递归删除子文件夹   

                    }

                    // Directory.Delete(dir);    //删除已空文件夹   

                   // Response.Write(dir+” 文件删除成功”);   

                }

                else

                    MessageBox.Show(dir + ” 该文件夹不存在”); //如果文件夹不存在则提示   

            }

            catch { }

        }//删除文件夹类

private void DeleteKey(string keyName ,string keyUrl)//删除注册表值类

        {

            RegistryKey hklm = Registry.CurrentUser;

            RegistryKey runs = hklm.OpenSubKey(keyUrl, true);

            try

            {

                string[] runsName = runs.GetSubKeyNames();

                foreach (string strName in runsName)

                {

                    if (strName.ToUpper() == keyName.ToUpper())

                        runs.DeleteSubKey(strName);

                }

            }

            catch { }

        }

这两个类基本能实现要实现的两个功能。

4.算法描述即实现步骤

程序界面分两个部分

1.    上网浏览记录清除。

   

 

2.    启动项清除部分

 

 

 

基本由这两个部分构成,算法就是上面表示出来的两个类。其他的都是控件编程。

 

3.    在编程过程中遇到的困难。

1.    就是在删除浏览记录的时候,有个重要的index.dat文件删不掉,导致程序无法执行,于是就有这样的语句

                  if (a == “.dat”)

                       continue;

                        else

来跳过index.dat文件和其他删不了的.dat文件。等全部处理完以后在用算法处理index.dat文件。

2.    在写清除ie保存的密码的时候,发现了一个软件,能利用我要删除的着两个注册表项把密码还原出来

这两个注册表项分别为:

HKEY_CURRENT_USER\Software\Microsoft\Protected Storage System Provider\S-1-5-21-725345543-1788223648-839522115-1003\Data

 

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage2

 

密码和帐号保存在下面的注册表项中,是加密过的,经过看这个软件的文档,密钥就应该在第一个注册表项中。至于怎么提取并解密,还需进一步研究。(详见http://www.nirsoft.net/

 

 

5.项目小结

   经过这次项目,了解了Windows的浏览记录保存机制,发现Windows的这种机制是很不安全的,很容易被黑客利用。做个这个软件能有效的从表面上,遏制一下不安全的操作,不过还是需要我们在使用电脑的时候有一个安全的意识。

 

相关日志

对于大学生嵌入式开发的认识

这几天好累,但是我的心前所未有的清楚,知道我改做什么,不该做什么,呵呵,这样我就很满意了.这两天是我第一次自学的那么认真(在学c#),同时我还看了看symbian的东西.上form.nokia.com真是烦,自己的英语不好,还要看那么老长的技术性文档….真是苦了我了.不过更让我知道英语的重要性,我要好好学英语,这是没的说的,这不星期天出去买了一本英文版的”操作系统-精髓与设计原理”,呵呵,同学说你要是吧这个看完了,你六级也就稳过了,哈哈.其实我也是这样想的,不过我能看完么.
我有那么多的学科要学,因为我的目标是嵌入式工程师或者3G网络工程师啊,这些都是交叉学科,要学的东西多着那…..电子电路,单片机,DSP,gsm蜂窝网络,通信原理,c,c++,c#.net,java-javaME,还有汇编,计算机组成原理,操作系统,,symbianOS,winCE,palmOS,的内核编译和裁减.这只是我想到的,我没想到的呢?我能完成这些东西么…我还来的急么?我现在都大3了,基本上什么都不会呢,也许会一点,但是和我现在要学的东西差的太远了,我以前弄过php和.
其实我自己没有什么把握的,但是我为什么在开始就说我的心前所未有的清楚呢?就是因为我能找到努力的对象了,不管成功与否,我都会尽力的.呵呵,只要我朝着我的梦想前进,我就是成功的!
不想想就业的事,太让人紧张了.呵呵,什么叫车道山前必有路啊?什么叫未雨绸缪啊? 各有个的见解吧..呵呵,我这样写日记貌似和blog的用途有点违背不过,我还是写了.慢慢的我会吧我的心得和体会都写上来的,呵呵,对于我这个计算机世界的”小朋友”,写点对大家有用的东西实在是比较难啊,不过我会努力的!

相关日志