您可以通过左右滑屏查看更多笔记内容。。

C

21 Jul 2019 . category: tech .
更多笔记

Linux 下的C程序

输出一个‘’hello word!‘’

  • stdio:标准输入输出流;

  • \n换行;

  • 步骤:

    cd ~ /workspace/–>cd lens1 –>touch a.c–>vi a.c进行编写如下代码:

    1. 导入stdio (标准输入输出流);

    2. 编写main方法进行打印;

    3. 代码:

      #include <stdi0.h>
      int  main(){
          printf("hello word!"\n);
          return 0;
      }
      
    4. 使用wq进行保存退出,进行输出:

    5. 输入:cc.a.c ,输入ls查看,默认输出了一个a.out 文件;

    6. ls -l查看文件权限; r-read 可读;w-write 可写 ;x 可执行;

    7. 执行a.out 文件:./a.out输出:”hello word“ (./:当前目录下)

多文件操作–在vim中同时编辑多个文件

  • %d:表示把数据按十进制整型输出;vi

  • :set nu:打开行号;

  • 在vim 中同时创建多个源文件,步骤如下:

    1. 在workspace下创建一个新的文件夹 mkdir lens2

    2. 首先编写一个hello.c文件: hello.c

      vi.hello.c进入编辑模式:
           
      #include <stdio.h>
      int max(int a,int b){
           
          if(a>b){
              return a;
          }else{
              return b;
          }
      }
      int main(){
           
          int a=22;
          int b=33;
          int maxNum=max(a,b);
          printf("max=%d",maxNum);
          return 0;
      }
      wq保存后,可查看结果` gcc hello.c--ls-->./a.out-->max=33
      
    3. 再次进入vi.hello.c 命令模式下输入::sp max.c创建一个名为max.c的文件;

    4. 使用Ctrl W+上下箭头可切换文件位置,选在在哪里编辑;

    5. 查看max()所占行数,8行,可将鼠标放在int max()位置处,按8dd可实现将max()函数进行剪切,然后使用Ctrl W+上箭头切换到max.c文件编辑位置,按p进行粘贴;

    6. wqa进行保存所有并退出;

    7. gcc max.c hello.c -o main.out

    8. 此时可查看ls

      lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens2$ ls
      	a.out  hello.c  main.out  max.c
      lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens2$ ./main.out
      	max=33lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens2$ ``
      

      一样可以得到结果;此时的max()函数在max.c文件中;

    9. 需要在hello.c中进行声明max()函数:

      #include "max.c"(include <系统中存在的库>;include "当前目录下寻找对应的")

      即可使用./a.out得到最终的输出结果;

多文件操作–头文件与函数定义分离

  • gcc -c max.c 可以生成一个名为max.o 的文件;gcc -c max.c -o m1.o并给他命名为m1.o;
  • max.o为可读可写不可执行;文件进行了编译,编译器对源代码进行了编译,编译成了计算级可识别的二进制;
  • 步骤:
    1. cp max.c min.c 拷贝max.c 文件,名为min.c;
    2. gcc -c min.c -o min.o 进行编译;
    3. 修改代码内容,为输出最小数;
    4. min.omax.o 编写成头文件:
    5. vi max.hint max(int a,int b);
    6. vi min.hint min(int a,int b);
    7. 在hello.c 中引入:
      1. #include "max.h"
      2. #include "min.h"
    8. gcc max.o min.o hello.c –>./a.out 进行编译得到结果;

Linux C语言–makeFile 的编写

  • 当有多个.o文件时,进行编译,需要gcc多个.o,很麻烦,为了更方便的编译,使用make指令;

  • make 工具,可以将大型的开发项目,分成若干个模块,更加清晰、快捷的整理、编译源文件;

  • makeFile的编写步骤:

    1. 首先将所有的.o文件进行删除 :rm *.o;

    2. 查看是否有make :make -v;若没有,则进行下载sudo apt install make;

    3. vi makefile 创建并开始便捷makefile文件;

    4. 添加注释:#this is make file; # 后内容被忽略;

    5. #this is make file
      hello.out:max.o min.o hello.c
              gcc max.o min.o hello.c -o hello.out
      max.o:max.c
              gcc -c max.c
      min.0:min.c
              gcc -c min.c
      
      • -o hello.out:是将自动生成的 .out 文件进行命名;
      • 解读这段代码:我们需要最终生成一个hello.out文件,需要依赖于max.o min.o hello.c,而其中只有hello.c文件是存在的,所以又需要将另两个没有的.o文件进行编译生成;
    6. wq 保存退出,输入make进行生成makefile 文件,使用ls查看,结果如下,

      hello.out hello.c makefile max.c max.h max.o min.c min.h min.o

    7. ./hello.out查看结果,也可得到最小值和最大值:

    8. 当我们只改动gcc max.o min.o hello.c -o hello.out这一行代码时,再次make则发现,程序只执行了gcc max.o min.o hello.c -o hello.out,也就是说:

      已经编译过的文件,如果没有修改,则不会重复编译,节省了时间;

main 函数

–return 0 的作用

  • 当同时执行两部操作时,通过&&连接,只有第一条指令成功执行(返回值为0),才会执行下一条执行;

  • 通过echo $?查看执行命令是否成功:如果返回值是0,就是执行成功;如果是返回值是0以外的值,就是失败。

  • 验证步骤:

    1. 新建一个文件lens3 :mkdir lens3;

    2. 在lens3下创建一个文件”main.out“:vi main.c;

    3. #include <stdio.h>
      int main(int argv,char* argc[])
      {
          printf("hello word\n");
          return 0;
      }
      
    4. 直接执行两部操作,通过&&链接:gcc main.c -o main.out && ./main.out 得到结果:”hello word“;

    5. 查看是否执行成功:echo $? 输出为0,代表执行成功;

    6. 将”main.c“中的返回值进行修改:return 101;

    7. 重新编译:gcc main.c -o main2.out && ./main2.out–>得到结果还是”hello word“;echo $?查看执行结果,为101,指令没有执行成功;

    8. 再执行./main2.out && ls–>得到结果还是”hello word“,没有执行ls ;

    9. 所以,如果要用”&&“则需要前一个指令成功时必须返回0

–main 函数的参数(重点)

argc、argv的具体含义

main( int argc, char* argv[] ) 中 第一个参数,int型的argc,为整型,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认值为1。 第二个参数,char*型的argv[],为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。各成员含义如下: argv[0]指向程序运行的全路径名 argv[1]指向在DOS命令行中执行程序名后的第一个字符串 argv[2]指向执行程序名后的第二个字符串 argv[3]指向执行程序名后的第三个字符串 argv[argc]为NULL ./m3.out

举例验证:

  1. 新建一个main2.c文件vi main2.c;

  2. 编辑内容:

    include <stdio.h>
    int main(int argv,char* argc[])
    {
        printf("argv is %d\n",argv);
        int i;
        //不可以直接在for循环中声明变量使用,会报错;
        for(i=0;i<argv;i++){
            printf("argc[%d] is %s\n",i,argc[i]);//%s是打印一个字符串
        }
        return 0;
    }   
    --wq保存并推出
    
  3. gcc main3.c -o m3.out 进行编译,然后使用ls查看结果

  4. 当输入:./m3.out as asf af时:得到入如下结果:

    argv is 4
    argc[0] is ./m3.out
    argc[1] is as
    argc[2] is asf
    

    *表达含义:argv is 4--表示程序运行时发送给了”main“4个参数;

         argc[0]/[1]/[2]--表示每个参数的值;

Linux C语言–标准输入流、输出流及错误流

–输入流、输出流、错误流基本介绍

  • stdin 输入流:默认根据键盘输入;

  • stdout 输出流:默认根据显示器输出;

  • stderr 错误流

  • 举例验证:

    #include <stdio.h>
    int main(){
       //printf("please input the value a :\n ")
        fprintf(stdout,"please input the value a :\n ");
        int a;
        fscanf(stdin,"%d",&a);
        if(a<0){
            fprintf(stderr,"the value must>0");
            return 1;
        }
        return 0;
    }
    wq-->gcc cio.c-->./a.out-->
    
  • 执行结果: lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens4$ ./a.out please input the value a : 3 lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens4$ ./a.out please input the value a :

    -1 the value must>0lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens4$ vi cio.c lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens4$

–输入流、输出流、错误流的重定向

  • “1»“输出流重定向,在原来的基础上追加新得内容;其中1可以不加

  • ”>“输出流重定向,覆盖原来的内容,只增加本次添加的新内容;

  • “2»“错误流重定向,错误内容;

  • ”<“输入流重定向;

    输出流重定向

    1. mkdir lens5-->cd lens5-->vi main.c-->

      #include <stdio.h>
      int main(){
          printf("input the int value i:\n");
          int i,j;
          scanf("%d",&i);
          printf("input the int value j:\n");
          scanf("%d",&j);
          printf("i+j=%d\n",i+j);
          return 0;
      }
      wq-->gcc main.c-->ls./a.out
      lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ ./a.out
         input the int value i:
         2
         input the int value j:
         3
         i+j=5
      
    2. 测试输出流重定向及”»“与”>“区别;

      ./a.out 1»a.txt

      ./a.out >a.txt

      lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ ./a.out 1>>a.txt
      	3
      	4
      lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ ls
      	a.out  a.txt  main.c
      lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ cat a.txt
      	input the int value i:
      	input the int value j:
      	i+j=7
      lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ ./a.out >>a.txt
      	3
      	6
      lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ cat a.txt
      	input the int value i:
      	input the int value j:
      	i+j=7
      	input the int value i:
      	input the int value j:
      	i+j=9
      lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ ./a.out >a.txt
      	6
      	7
      lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ cat a.txt
      	input the int value i:
      	input the int value j:
      	i+j=13
      

    输入流重定向

    1. 首先新建一个文件可以存放提前要输入的内容:vi input txt 输入两个数字6/8

    2. ./a.out <input.txt 可直接得到输出的结果:

      input the int value i:
      input the int value j:
      i+j=14
      

输入流、输出流、错误流

  • 首次增加标准错误流

    #include <stdio.h>
    int main(){
        printf("input the int value i:\n");
        int i,j;
        scanf("%d",&i);
        printf("input the int value j:\n");
        scanf("%d",&j);
        if(j!=0){
           printf("i/j=%d\n",i/j);
        }else{
            fprintf(stderr,"j!=0\n");
            return 1;
        }
        return 0;
    }
    wq-->cc main.c-->ls-->./a.out
    
    • 进行测试:
    lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ ./a.out
        input the int value i:
    	1
    input the int value j:
    	5
    	i/j=0
    lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ ./a.out
    	input the int value i:
    	4
    input the int value j:
    	0
    	j!=0
    
    • 当正常进行输入输出流重定向时:
    lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ ./a.out 1>t.txt 	2>f.txt
    	4
    	0
    lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ ls
    	a.out  f.txt  input  main.c  t.txt
    lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ cat t.txt
    	input the int value i:
    	input the int value j:
    lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ cat f.txt
    	j!=0
      
    
    • 当进行输入、输出、错误流重定向时:
    lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ ./a.out 1>t.txt 2>f.txt <input.txt
    lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ ls
    	a.out  f.txt  input  main.c  t.txt
    lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ cat f.txt
    	bash: input.txt: 没有那个文件或目录
    lixuehe@lixuehe-ThinkPad-T420:~/workspace/lens5$ cat t.txt //输入流无结果
    

管道

  • ls 查看当前目录;

  • ls/ 查看根目录;

  • ls /etc/ 查看etc目录下的内容;

  • ls/etc/ grep ab 查看etc 下所有包含ab 的文件;
  • ps -e 当前运行的进程;

  • ps -e grep ssh 当期进程有无包含ssh 的进程,如果有证明已经启动ssh ;

    ”|“即为管道:通过管道,我们可以将etc中的内容变为输出流,通过管道,作为输入流传递给grep;自动实现输入输出;

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问