精华内容
下载资源
问答
  • Linux系统编程之模拟命令cp

    千次阅读 2016-11-12 21:31:02
    最近在学习linux环境编程用学到的文件编程一个模拟命令 cp的代码,当然有很多不足之处,但是基本功能都实现。 文件编程用到的函数不明白的可以百度。其实这个也只是为了加深对Linux系统的理解。代码有什么...

    最近在学习linux环境编程,用学到的文件编程写了一个模拟命令 cp的代码,当然有很多不足之处,但是基本功能都实现了。 文件编程用到的函数不明白的可以百度。其实学这个也只是为了加深对Linux系统的理解。代码有什么问题请回复,方便大家交流学习。

    #include <unistd.h>
    
    #include <stdio.h>
    
    #include <stdlib.h>
    
    #include <dirent.h>
    
    #include <sys/types.h>
    
    #include <sys/stat.h>
    
    #include <string.h>
    
    #include <fcntl.h>
    
    #define BUFFERSIZE 10000
    
    int isdir(char *src)
    
    {
    
    
    
        struct stat is_dir;
    
        //lstat函数把源文件名的文件类型和存储权限传给stat结构体中的st_mode变量 
    
        lstat(src, &is_dir);
    
        //S_ISDIR函数判断该文件是不是目录文件 
    
        if(S_ISDIR(is_dir.st_mode))
    
        {
    
            return 1;
    
        }
    
        return 0;
    
    }
    
    //文件拷贝到文件 或文件拷贝到目录下 
    
    int copyF2F(char *src_file, char *dest_file)
    
    {
    
        int in_fd, out_fd, n_chars;
    
    
    
        char buf[BUFFERSIZE];
    
        //如果目的地址是目录,则默认在该目录下创建一个与源文件同名的文件   
    
        if(isdir(dest_file))
    
        {
    
            char c;
    
            char temp[10] = {'\0'};
    
            char r_temp[10] = {'\0'};
    
            int n = strlen(src_file);
    
            int m = 0;
    
            //记录源文件最后一个'/'之后的内容 
    
            while((c = src_file[n-1]) != '/')
    
            {
    
                //用temp数组存下来 
    
                temp[m] = c;
    
                m++;
    
                n--;
    
            }
    
            int j = 0;
    
            //由于temp数组存下来的字符是反的,所以反转一下字符 
    
            for(int i = strlen(temp)-1; i >=0; i--)
    
            {
    
                r_temp[j] = temp[i];
    
                j++;
    
            }
    
            r_temp[j] = '\0';
    
            //将源文件的最后的文件名和目的文件目录拼接起来 
    
            strcat(dest_file, r_temp);
    
        }
    
        //打开源文件,获取到文件描述符,失败返回-1 
    
        if((in_fd = open(src_file, O_RDONLY)) == -1)
    
        {
    
            printf("%s is error", src_file);
    
            return 1;
    
        }
    
        //打开目的文件,获取文件描述符,失败返回-1,注意此时需要写的权限所以参数应该有O_WRONLY,并且如果不存在需要有权限创建。具体的函数用法参照上之前写的文件I/O编程博客 
    
        if((out_fd = open(dest_file, O_WRONLY | O_CREAT, 0644)) == -1)
    
        {
    
            printf("open is error");
    
            return 1;
    
    }
    
        //现在源文件和目的文件的文件描述符都获取到了,开始复制。read函数第一个参数代表要读出的文件描述符,第二个参数代表存数据的数组首地址,第三个参数代表要读出多少个字节。读取成功返回读取的字节数,有错返回-1 
    
        if((n_chars = read(in_fd, buf, BUFFERSIZE))>0)
    
        {
    
            //写入目标文件中。错误返回-1 
    
            if(write(out_fd, buf, n_chars)<0 )
    
            {
    
                printf("%s write error", dest_file);
    
                return 1;
    
            }
    
        }
    
        //close函数用于关闭文件,打开文件了记得关 
    
        if(close(in_fd) == -1 || close(out_fd) == -1)
    
        {
    
            printf("error");
    
            return 1;
    
        }
    
        return 0;
    
    }
    
    //目录拷贝到目录下 
    
    int copyD2D(char *src_dir, char *dest_dir)
    
    {
    
        //用来获取打开文件目录时返回的指针 
    
        DIR *dp = NULL;
    
        struct dirent *dirp;
    
        char tempDest[256];
    
        char tempSrc[256];
    
        strcpy(tempDest, dest_dir);
    
        strcpy(tempSrc, src_dir);
    
        //opendir打开文件目录,返回NULL代表打开失败 
    
        if((dp = opendir(src_dir)) == NULL)
    
        {
    
            return 1;
    
        }
    
        else
    
        {
    
            //readdir()返回参数dir目录流的下个目录进入点 
    
            while((dirp = readdir(dp)))
    
            {
    
                if(isdir(dirp->d_name))  //d_name是文件的名称 
    
                {
    
                    strcat(tempDest, dirp->d_name);     
    
                    strcat(tempSrc, dirp->d_name);
    
                    //将目录中的文件拷贝到另一个目录中 
    
                    copyF2F(tempSrc, tempDest);
    
                    //把tempDest和tempSrc重新初始化成目录名 
    
                    strcpy(tempDest, dest_dir);
    
                    strcpy(tempSrc, src_dir);
    
                }
    
            }
    
            //关闭打开的目录 
    
            closedir(dp);
    
            return 0;
    
    
    
        }
    
    }
    
    
    
    int main(int argc, char * argv[])
    
    {
    
        int c, flag = 0;
    
        while((c = getopt(argc, argv, "rRls"))!=-1)
    
        {
    
            switch(c)
    
            {
    
                //选项为-R或-r时,执行目录之间的拷贝 
    
                case 'R':
    
                case 'r':
    
                    copyD2D(argv[2], argv[3]);
    
                    flag = 1; 
    
                    break;
    
                //选项为-l时,创建链接 
    
                case 'l':
    
                    if(isdir(argv[2]))
    
                    {
    
                        printf("dir can't create a link");
    
                        exit(1);
    
                    }
    
                    if(link(argv[2], argv[3])==0)
    
                    {
    
                        return 0;
    
                    }
    
                    else
    
                    {
    
                        printf("create a link failed");
    
                    }
    
                    flag = 1;
    
                    break;
    
                case 's':
    
                    if(isdir(argv[2]))
    
                    {
    
                        printf("dir can't create a symlink");
    
                    }
    
                    if((symlink(argv[2], argv[3])) == 0)
    
                    {
    
                        return 0;
    
                    }
    
                    else
    
                    {
    
                        printf("create a symlink failed");
    
                    }
    
                    flag = 1;
    
                    break;
    
            }
    
        }
    
        if(flag == 0)
    
        {
    
            copyF2F(argv[1], argv[2]);
    
        }
    
        return 0; 
    
    }
    
    展开全文
  • Linux C 编程一站式学习.pdf

    千次下载 热门讨论 2010-11-24 01:27:27
    Linux系统编程 28. 文件与I/O 1. 汇编程序的Hello world 2. C标准I/O库函数与Unbuffered I/O函数 3. open/close 4. read/write 5. lseek 6. fcntl 7. ioctl 8. mmap 29. 文件系统 1. 引言 2. ext2文件系统 2.1. ...
  • 管道那里只是说下匿名管道且是用于血缘关系的进程里面才行,为什么没有提到有名管道,个人认为有名管道没有共享内存的广泛就没有多说,这里主要给说一说常用的一种用于非血缘关系进程间通信的方法——共享内存...

    IPC之共享内存(通过mmap实现)

    管道那里只是说了下匿名管道且是用于有血缘关系的进程里面才行,为什么没有提到有名管道,个人认为有名管道没有共享内存用的广泛就没有多说,这里主要给说一说常用的一种用于非血缘关系进程间通信的方法——共享内存。

    概念还是概念,学习一个新的东西肯定是从概念进行入手的,那么看看共享内存的概念是什么:

    共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。

    这次我主要通过mmap函数通过映射同一个普通文件来实现共享内存。普通文件被映射到地址空间后,进程可以向访问普通内存一样对文件进行访问。可以当一个malloc出来的空间进行使用,直接使用memcpy而不用read,write了。

    在使用mmap的时候需要注意的就是这个函数的参数。一起看看这个函数。


    这么多的参数在图中都有用法解说,下面来说一说每一个参数的注意点:

    1.length一般由你指定的文件大小来指定。(注意:映射文件大小为0的时候,不能创建映射区。mmap时常会有总线错误的提示,通常都是因为共享文件存储空间大小引起的)

    因为你需要先打开一个文件来进行mmap进行映射


    2.创建映射区的权限要小于等于打开文件的权限。

    这个意思就是在映射区权限那一块你设置的权限必须比你文件打开时设置的权限小或者相等


    3.映射区创建的时候隐含的对文件的一次读操作,所以文件必须要有读权限


    4.偏移量必须是4k的整数倍,是一页一页的偏移的,有一个内存地址对齐。


    5.文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映射调用系统中作用很大。


    6.映射区是mmu帮助你完成映射的。


    7.先关闭文件是没有关系的但是必须打开了文件描述符然后才能创建一个映射区。


    8.mmap创建映射区的时候建议检查返回值,出错率较高。


    说完mmap了,如果在linux上查看man page可以看到下面有个mummap这个函数,这个函数就是关闭这一块共享内存区的函数,注意的是mumap传入的地址肯定要是mmap的返回的地址,不能进行指针++这种操作,因为这个返回值的步长是不定的,会出现错误。


    最后需要说的一点就是如果大家在virtual box这款虚拟机上使用的时候有一个注意事项,就是映射区建立的文件是不能在虚拟机的共享文件夹里面的,这个我感觉应该是涉及到某些文件类型之类的。

    大致就是这些。

    下面贴一段血缘关系的mmap的使用:

    #include <stdio.h>
    #include <sys/mman.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <string.h>
    
    
    int main(void)
    {
        char *p;
        pid_t pid;
        int fd;
        fd = open("temp", O_RDWR|O_CREAT|O_TRUNC, 0644);
        unlink("temp");
        ftruncate(fd, 200);
        p = (char*)mmap(NULL, 200, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
        if(p == MAP_FAILED)
        {
            perror("mmap error");
            return 0;
        }
        close(fd);
        pid = fork();
        if(pid > 0)
        {
            memcpy(p , "I'm parrent,I writed this word!\n", 34);
            sleep(1);
        }
        if(pid == 0)
        {
            printf("%s\n",p);
            wait(NULL);
        }
        if(pid == -1)
        {
            perror("fork() error");
            return 0;
        }
        munmap(p, 200);
        return 0; 
    }
    



    如果非血缘关系可以查看下面两个

    这是写:

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/mman.h>
    #include <string.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    typedef struct student{
        int id;
        char name[20];
        char sex;
    }student;
    
    int main(int argc, char *argv[])
    {
        int fd;
        int n;
        student s1 = {1, "xiaoming", 'm'};
        student *s;
        if(argc < 2)
        {
            printf("mmap_ww error: argc error");
            return 0;
        }
        fd = open(argv[1], O_RDWR|O_CREAT|O_TRUNC, 0644);
        if(fd == -1)
        {
            perror("open() error");
            return 0;
        }
        ftruncate(fd, sizeof(student));
        s = (student*)mmap(NULL, sizeof(student), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
        if(s == MAP_FAILED)
        {
            perror("mmap error");
            return 0;
        }
        close(fd);
        n = (argv[2][0]-48);
        while(n)
        {
            memcpy(s, &s1, sizeof(student));
            s1.id++;
            sleep(1);
            n--;
        }
        sleep(20);
        munmap(s, sizeof(student));
        return 0;
    }
    
    


    这是读:

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/mman.h>
    #include <string.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    
    typedef struct student{
        int id;
        char name[20];
        char sex;
    }student;
    
    int main(int argc, char *argv[])
    {
        int fd;
        int n;
        student *s1;
        student *s;
        if(argc < 2)
        {
            printf("mmap_rr error: argc error");
            return 0;
        }
        fd = open(argv[1], O_RDONLY);
        if(fd == -1)
        {
            perror("open() error");
            return 0;
        }
        s = (student*)mmap(NULL, sizeof(student), PROT_READ, MAP_SHARED, fd, 0);
        if(s == MAP_FAILED)
        {
            perror("mmap error");
            return 0;
        }
        s1 = (student*)malloc(sizeof(student));
        memcpy(s1, s, sizeof(student));
        n = 3;
        while(n)
        {
            printf("id = %d, name = %s, sex = %c\n",s1->id,s1->name,s1->sex);
            sleep(1);
            n--;
        }
        return 0;
    }
    



    展开全文
  • LinuxC编程一站式学习

    2013-03-16 12:35:05
    Linux系统编程。介绍各种Linux系统函数和内核的工作原理。Socket编程的章节改编自亚嵌教育卫剑钒老师的讲义。 为什么要在Linux平台上学C语言?WindowsC语言不好吗? Windows还真的是不好C语言。C语言是一...
  • 前面的很多答案,说的都挺道理因为python这个语言在我们常用的电脑上面都能够运行按操作系统来:windows、linux、macos 运行都没有问题32位或者是64位的系统都是支持的。所以总的来说,你要你觉得电脑起来不...

    看了前面的很多答案,说的都挺有道理

    因为python这个语言在我们常用的电脑上面都能够运行

    按操作系统来:windows、linux、macos 运行都没有问题

    32位或者是64位的系统都是支持的。

    所以总的来说,你要你觉得电脑用起来不卡顿,后续学习python都没有什么太大的问题。

    但是回到题目推荐电脑的话题,我可以按照预算给你推荐一下:预算3000或者是3000以下:

    强烈推荐台式机

    优势:性能强,很多时候能够碾压5000左右的笔记本

    缺点:不方便携带

    (所以3000预算以上,没有携带的需求,可以优先考虑台式机)

    所以,如果你是决定在家学习,没有其他的考虑,我觉得一个台式机都够了,我之前在京东上面看到了这款:【戴尔Vostro 3471-R13N8R】戴尔(DELL)成就3471 英特尔酷睿i3 高性能 商用办公 台式电脑整机(i3-9100 8G 1T 四年上门 WIFI)21.5英寸【行情 报价 价格 评测】-京东​item.jd.com

    i3九代+8G内存+1T硬盘+键盘鼠标+21寸的显示器 秒杀2800

    用它来学习python完全没有任何问题。

    2. 预算3000-8000左右:

    推荐ThinkPad

    优势:键盘手感笔记好,打字太久手不会累

    缺点:相同的配置下thinkpad 偏贵

    工程师们很多都很偏爱Thinkpad,方方正正的设计感觉很棒

    【这里插一个个人经历】

    几年前我自己准备买一个笔记本的时候,看中了thinkpad 的T250,当时的价格6000左右,觉得有点贵,最终没买,买了一款当时的华硕的超薄本,从此后悔了一年。

    thinkpad的种类挺多的,主要可以这样区分:

    E系列

    E系列很一般,不推荐买

    T系列算是中端,很多人用,推荐

    X系列高端本,但是价格都是1W+

    所以可以根据自己的预算在T系列中选择一款,内存尽可能大一点就行。

    如果觉得JD价格太高,也可以看看淘宝。

    3. 预算8000以上:

    推荐macbook pro

    优势:对编程非常友好,很多程序员使用

    缺点:略贵

    比如这个老款的macbook pro 不到8000【AppleMacBook Pro】Apple Macbook Pro 13.3【无触控栏】Core i5 8G 128G SSD 深空灰 笔记本电脑 轻薄本 MPXQ2CH/A【行情 报价 价格 评测】-京东​item.jd.com

    如果预算更多的话,可以考虑16寸的macbook pro,体验很棒。

    但是如果还是习惯使用Windows系统,也可以考虑雷蛇笔记本。个人觉得在高端笔记本里面,雷蛇的做工,无人能出其右。

    比如这款:【雷蛇灵刃潜行版】雷蛇(Razer)灵刃13潜行竞技版 水银版 13.3英寸轻薄窄边框笔记本电脑(i7-1065G7 16G 256G PCIE )【行情 报价 价格 评测】-京东​item.jd.com

    最后,如果是打算学习python来做人工智能(AI),可以优先考虑带有英伟达显卡(gtx,显存>=4G)的笔记本,能够帮助自己在训练模型的时候加速不少。

    展开全文
  • 今天起,开始新的知识的学习,对于上个系列进程的学习还差一个理论上的总结,这个会下次补回来,以便通过实践之后,再理论将其巩固一下,好,话不多说,开始进入这个主题的学习----信号,很重要,但不是太容易...

    今天起,开始新的知识的学习,对于上个系列进程的学习还差一个理论上的总结,这个会下次补回来,以便通过实践之后,再用理论将其巩固一下,好了,话不多说,开始进入这个主题的学习----信号,很重要,但不是太容易理解,所以得一步一步来!

    中断【纯概念,但是很重要】:
    在学习信号之前,首先需要理解一下什么是中断,因为信号与中断有很多的相似之处,中断,顾名思义就是中途打断:
     
    那什么是异步事件呢?它是没有一定时序关系,随机发生的事件,在中断技术出现之前,计算机对异步事件处理能力是有限的,通过是通过查询的方式来处理的,举一个现实生活中的例子:
    比如张三正在看书,这时厨房里又正在烧开水,这时,张三看书时并不知道水是否烧开了,他就需要跑到厨房当中"查询"一下水是否烧开了,然后再回来看书,这时又不放心厨房水是否烧开了,于是又跑进厨房查询,如此循环,直到水烧开之后,他才能够静下心来看自己的书,这就是典型的查询技术
    有了中断技术后,又是如何的呢?还是以上面这个例子:
    张三在看书的同时,设置一个闹钟,比如说是10分钟的闹钟,当水烧开的时候,会响铃,其中响铃可以看作是一个中断信号,闹钟可以看成是一个中断源,当闹钟响之后,张三就会去处理这一次的中断事件,也就是跑到厨房将煤气给关闭,将开水倒进热水瓶当中,这叫中断执行程序,实际上张三在做这件事之前,需要保护现场,记住当前看到了第几页,当执行完中断执行程序之后,则恢复现场,继续从之前看到的页数开始看书,这就是中断执行的整个流程,总结一下:
      中断源  ->  中断屏蔽  ->  保护现场  ->  中断处理程序  ->  恢复现场
    中断处理程序是保存在哪的呢?实际上,它的入口地址是保存在中断向量表当中的,由于计算机中的中断个数是固定的,一般在操作系统启动的时候,会初始化一个中断向量表,它会保存固定个数的中断处理程序入口的地址,这样的话,CPU就可以根据中断号,从中断向量表当中找到对应中断的中断处理程序的入口地址,从而调用处理程序。
    对于闹钟这个中断源,产生了一个中断信号,不同的中断源会产生不同的中断信号,再回到这个例子,张三在看书的时候,可能闹钟响的同时,会听到外面有人敲门的中断信号到来,还有可能是电话响起来产生另外一个中断信号,但是对于同时到来的中断,张三可以决定哪个中断先处理,这也就是中断的优先级,他觉得开水烧开的中断优化级最高。另外张三也有可能屏蔽一些不必要的中断,比如说电话响铃了,在看书之时,他觉得这个中断是可以屏蔽的,也就是中断屏蔽.
     
    中断分类:
     
    比如键盘产生的中断、鼠标产生的中断、打印机产生的中断等,这些都是属于硬件中断。
    比如说除0中断、单步执行、对于X86平台来说执行了一个INT指令,从用户空间到内核空间
     
    信号【核心】:
     
    信号与中断总结:
     
     
    信号名称:
    那在linux/unix下,到底有哪些信号呢?我们可以通过一个命令进行查看:
     
    这些信号都有它们不同的涵义:
    对于这些信号的默认处理行为(也就是我们可以自定义自己的行为),可以在man手册上查询到:
     
    进程对信号的三种响应:
    当对于到来的信号,可以有三种不同的响应
     
    为什么呢?SIGKILL是杀死进程的信号,它是9号进程:
    在shell命令中,我们可以用kill -9 pid来对一个进程进行杀死,如果进程能够忽略9号信号的话,意味着当管理员向进程发送9号信号时,如果进程可以屏蔽不处理的话,那就无法杀死一个非法的进程了,而同理,SIGSTOP是停止一个进程信号,
    也就是我们看到的信号对应的action,上面有介绍过:
     
    signal:
    下面来学一下安装信号函数:
    下面以代码来进行说明:
    编译运行:
    按下ctrl+c:
     
    可以信号是一种异步事件的响应,当响应完之后,会还原现场,又回到了for死循环代码上了:
    这时按下ctrl+\退出:
    实际上,ctrl+\会产生一个退出信号:
    由于我们程序没有注册该信号,所以由系统默认处理,既程序结束。
    对于signal函数,它的返回值为它注册的上一个信号的处理程序,这样说有点空洞,下面以程序来说明一下:
    #include <unistd.h>
    #include <sys/stat.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include <fcntl.h>
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <signal.h>
    
    
    #define ERR_EXIT(m) \
        do \
        { \
            perror(m); \
            exit(EXIT_FAILURE); \
        } while(0)
    
    void handler(int sig);
    int main(int argc, char *argv[])
    {
        __sighandler_t oldhandler;
        oldhandler = signal(SIGINT, handler);//这时返回的处理程序是注册handler之前的,也就是系统默认的处理程序
        if (oldhandler == SIG_ERR)
            ERR_EXIT("signal error");
    
        while (getchar() != '\n')//死循环是为了测试,当按了ctrl+c之后,会不断死循环,直到按了回车键
            ;
        if (signal(SIGINT, oldhandler) == SIG_ERR)//这时,再次注册信号,但是这次是注册成了默认处理程序,而ctrl+c的默认处理就是终止程序
            ERR_EXIT("signal error");
        for (;;) ;
        return 0;
    }
    
    void handler(int sig)
    {
        printf("recv a sig=%d\n", sig);
    }

    编译运行:

    按回车键:

    这时,再按ctrl+c:

    实际上,恢复默认的处理行为,还可以用它来代替:

    编译运行,输出效果一样:

    好了,今天的学习先到这,下回见!

    转载于:https://www.cnblogs.com/webor2006/p/3515676.html

    展开全文
  • ----在上一篇文章中,我们已经对进程这个概念有了一个基本的认识,今天我们来继续学习进程的实战操作----父子进程对文件的操作,以及什么是僵尸进程和孤儿进程?下面我们就开始来揭开它们神秘的面纱!一、父子进程对...
  • 上一讲我们说到信号,进程间的整型数据可以通过信号进行传递,但是其他信号(例如结构体)信号就不够用了。而在进程中我们到每个进程都各自独立的地址空间,进程互相不能访问,所以进程间若想进行数据交换,就...
  • 本文集中介绍bash编程中部分高级编程方法和技巧。通过学习本文内容,可以帮你解决以下问题:1、bash可以网络编程么?2、.(){.|.&};.据说执行这些符号可以死机,那么它们是啥意思?3、你是什么保证crond中的任务不...
  • 学习linux内核能做什么

    千次阅读 2014-05-15 11:45:14
    1、了解Linux内核的具体工作细节,对我们系统编程来说是非常用处的,比如你了解某个系统调用在内核中是怎么实现,起来就会更加得心应手。 2、学习Linux内核的工作原理和具体实现细节,本身就是一种挑战,内核...
  • 第四课.LinuxShell编程

    2020-11-10 19:31:42
    人说Linux系统犹如核桃,外壳和内核; 内核:kernal,Linus集中精力研究内核开发; 外壳:shell,是命令行或者界面的应用程序; 狭义的shell指一种应用程序,提供一个界面,用户通过这个应用才可以访问内核...
  • Linux shell编程指南

    2015-05-29 22:40:12
    本书共分五部分,详细介绍shell编程技巧,各种UNIX命令及语法,还涉及UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 ...
  • 什么是异步通讯?...即我们建立的每个socket、open打开的每个文件等)2、把需要判断的句柄加入到集合里3、设置判断时间4、开始等待,即select5、如果在设定的时间内任何句柄状态变化就马上返回,
  • 什么是异步通讯?...即我们建立的每个socket、open打开的每个文件等)2、把需要判断的句柄加入到集合里3、设置判断时间4、开始等待,即select5、如果在设定的时间内任何句柄状态变化就马上返回,
  • 最近学习Hadoop需要使用eclipse进行编程,本人在前天经过一番研(百)究(度)之后在虚拟机上安装好eclipse,下面将我安装过程给大家介绍一下,如果有什么问题还望各位大佬指出,谢谢! 文章目录@[TOC]安装所需工具一...
  • Unix/Linux 编程实践教程.PDF

    千次下载 热门讨论 2010-09-03 18:34:12
    1.2 什么系统编程 1.2.1 简单的程序模型 1.2.2 系统模型 1.2.3 操作系统的职责 1.2.4 为程序提供服务 1.3 理解系统编程 1.3.1 系统资源 1.3.2 目标:理解系统编程 1.3.3 方法:通过三个问题来理解 1.4 ...
  • 现在再让我谈OZO直播系统,我就得说了,我可以说网络编程,多线程编程,SDK等等,不会之前...现在学了Linux应用层编程之后,你再看这些就感觉不一样了。 17年当时我就买了nginx的书看,说明我当时已经认识到要深入
  • 顶盒上到底有什么意义,把一个手机风格的 GUI 移植到工控机里又有什么意义? 所以,最简单的办法,就是自已构造一个小型的 GUI 环境,只针对你的应用,与 其他系统无关。 那么,可能有人会说,量体裁衣开发一个适合...
  • 本书共分五部分,详细介绍shell编程技巧,各种UNIX命令及语法,还涉及UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 ...
  • 本书共分五部分,详细介绍shell编程技巧,各种UNIX命令及语法,还涉及UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell ...
  • 先说说为什么在公司里服务器用Linux系统而非Windows系统。其实吧,我感觉主要就是前者更靠谱,一个字就是稳!不说别的,就我现在写博客的电脑没事给我黑个屏,断个网啥的。而且总漏洞,保不齐就被黑。这要是...
  • 本书共分五部分,详细介绍shell编程技巧,各种UNIX命令及语法,还涉及UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell...
  • 本书共分五部分,详细介绍shell编程技巧,各种UNIX命令及语法,还涉及UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell...
  • TCP/IP进行网际互联第三卷:客户-服务器编程与应用(Linux/POSIX套接字版) 基本信息 原书名:Internetworking With TCP/IP Vol Ⅲ:Client-Server Programming And Applications Linux/POSIX Sockets V 作者: ...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 217
精华内容 86
关键字:

学了linux系统编程有什么用

linux 订阅