2017.1.3 网络编程--文件与进程

  • getpwuid() 给出用户的具体数据

函数原型:
struct passwd *getpwnam(const char *name);
struct passwd *getpwuid(uid_t uid);
结构体成员:

struct passwd
 {
char   *pw_name;       /* username */
char   *pw_passwd;     /* user password */
uid_t   pw_uid;        /* user ID */
gid_t   pw_gid;        /* group ID */
char   *pw_gecos;      /* user information */
 char   *pw_dir;        /* home directory */
char   *pw_shell;      /* shell program */
 };
  • memset();清零

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
常见错误
第一:搞反了 ch 和 n 的位置. 一定要记住如果要把一个char a[20]清零,一定是 memset(a,0,20); 而不是 memset(a,20,0);


ctime();
getgrgid();获得给出组的信息
getpid();获得当前进程的pid号
getppid();获得当前进程的父进程pid号
fork(); 复制生成子进程
exec();替换子进程
getcwd();查看当前的工作目录


  • wait();

会暂时停止目前进程的执行, 直到有信号来到或子进程结束. 如果在调用wait()时子进程已经结束, 则wait()会立即返回子进程结束状态值. 子进程的结束状态值会由参数status 返回, 而子进程的进程识别码也会一快返回. 如果不在意结束状态值, 则参数 status 可以设成NULL. 子进程的结束状态值请参考waitpid().

strtok();字符串按格式分割
open(); 打开一个文件
read(); 读取打开的文件
write(); 写入读取到的缓存字符
access();判断文件的权限 R_OK W_OK X_OK F_OK
opendir();打开一个目录并返回一个DIR *类型的指针指向目录项
readdir();读取一个目录流并将信息保存在结构体中struct dirent 中
closedir();与opendir配对,用来关闭打开的目录
atexit() 设置程序正常结束前调用的函数
execl() 执行文件函数
execlp() 从PATH 环境变量中查找文件并执行
execv() 执行文件函数
execve() 执行文件函数
execvp() 执行文件函数


  • 几个用的命令

ps aux 查看所有进程
top 打开一个类似于任务管理器的界面,可看到zombie进程
kill 传入信号,-l是查看所有的参数

练习

1.实现ls

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>

int main(int argc,char *argv[])
{

     DIR *dirp = NULL;
     struct dirent *dp = NULL;
     struct stat sp;
     char str[11] = {"\0"};
     if((dirp = opendir("/home/w/桌面/f")) == NULL)d
     {
         perror("opendir preeor");
         return 1;
     }
    while((dp = readdir(dirp)) != NULL)
    {
        if(dp->d_name[0] != '.')
        {
            stat(dp->d_name , &sp);
            str[0] = '-';
            if(sp.st_mode & S_IFBLK) str[0] = 'b';
            if(sp.st_mode & S_IFDIR) str[0] = 'd';
            if(sp.st_mode & S_IFCHR) str[0] = 'c';
            if(sp.st_mode & S_IFIFO) str[0] = 'p';
            
            if(sp.st_mode & S_IRUSR) str[1] = 'r';
            else str[1] = '-';
            if(sp.st_mode & S_IWUSR) str[2] = 'w';
            else str[2] = '-';
            if(sp.st_mode & S_IXUSR) str[3] = 'x';
            else str[3] = '-';
            
            if(sp.st_mode & S_IRGRP) str[4] = 'r';
            else str[4] = '-';
            if(sp.st_mode & S_IWGRP) str[5] = 'w';
            else str[5] = '-';
            if(sp.st_mode & S_IXGRP) str[6] = 'x';
            else str[6] = '-';
            
            if(sp.st_mode & S_IROTH) str[7] = 'r';
            else str[7] = '-';
            if(sp.st_mode & S_IWOTH) str[8] = 'w';
            else str[8] = '-';
            if(sp.st_mode & S_IXOTH) str[9] = 'x';
            else str[9] = '-';
            printf("%s %ld %ld \t%s \n",str,sp.st_nlink,sp.st_size,dp->d_name);
        }
    }
     closedir(dirp);
     return 0;
}

2.实现cp命令并改进

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define BUFFER_S 100

int main(int argc,char *argv[])
{
    int src_fd = 0;
    int dst_fd = 0;
    int n = 0;
    char ch = '0';
    char buf[BUFFER_S] = {'\0'};
     if(argc != 3)
     {
         printf("usage : %s <src_file><dst_file>\n",argv[0]);
         return 1;
     }
     if((src_fd = open(argv[1],O_RDONLY)) == -1)
     {
        perror("open dst_fd perror");
        return 1;
     }
     while(1)   
     {      
     if(access(argv[2],F_OK) == 0)
     {
         printf("目的文件名已经存在!是否覆盖掉?(y ro n)");
         scanf("%c",&ch);
         getchar();
         if(ch == 'y')
         {
            if((dst_fd = open(argv[2],O_WRONLY | O_TRUNC,S_IRWXU)) == -1)
            {
                perror("open dst_fd perror");
                    return 1;
            }
            break;
         }
         else if(ch == 'n')
         {
            printf("是否重新输入目的路径?(y ro n)");
            scanf("%c",&ch);
            getchar();
            if(ch == 'y')
            scanf("%s",argv[2]);//最好不占用不改变argv的值
            else 
               return 1;
         }
         else 
            break;
     }
     else 
     {
        if((dst_fd = open(argv[2],O_WRONLY | O_CREAT,S_IRWXU)) == -1)
        {
                perror("open dst_fd perror");
                return 1;
        }
        break;
     }
     }
     while((n = read(src_fd,buf,BUFFER_S)) > 0)
     {
         write(dst_fd,buf,n);
     }
     close(src_fd);
     close(dst_fd);
     return 0;
}

3.实现ls命令

#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>
#include <unistd.h>
#include <string.h>

#define MAX_CMD_LEN 128

void main(int argc,char *argv[])
{
    pid_t pid;
    char in[MAX_CMD_LEN] = {'\0'};
    char cmd[MAX_CMD_LEN] = {'\0'};
    char cmdl[MAX_CMD_LEN] = {'\0'};
    char pwd[MAX_CMD_LEN] = {'\0'};
    char* delim = " ";
    char* p = NULL;
    int status = 0;
    
    struct passwd *pw;
    
    while(1)
    {
        pw = getpwuid(getuid());
        getcwd(pwd,MAX_CMD_LEN);
        printf(" %s@|%s>",pw->pw_name,pwd);
        fgets(in,MAX_CMD_LEN,stdin);
        in[strlen(in) - 1] = '\0';
        p = strtok(in,delim);
        if(p == NULL)
            continue;
        strcpy(cmd,p);
        if(strcmp(cmd,".exit") == 0)
            return ;
        p = strtok(NULL,delim);
        if(p != NULL)
        {
            strcpy(cmdl,p);
            if(fork() == 0)
            {
                execlp(cmd,cmd,cmdl,NULL);
                return ;
            }
        }
        else 
        {
            strcpy(cmdl,"NULL");
            if(fork() == 0)
            {
                execlp(cmd,cmd,NULL);
                return ;
            }
        }
        wait(&status);
    }   
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容