轻量级前端框架助力开发者提升项目效率与性能
588
2022-09-06
杂记 (2) —— linux and C
问题
linux操作, ssh, vi
自动获取IP的网卡设置怎嘛查看IPv4? 将/etc/sysconfig/network-scripts/ifcfg-eth0中的BOOTPROTO的值更改成dhcp. 然后ifdown 网卡名, ifup 网卡名.linux某一项service没有找到? 将可执行文件的路径加入PATH中。相关文件(ubuntu): /etc/environment能Ping通linux,但是不能ssh远程登录。 查看ssh服务是否开启,ps -e |grep ssh 没有ssh存在就说明没有ssh服务。
$ ps -e |grep ssh 4682 ? 00:00:00
则是存在的. 解决ssh服务问题: 在/etc/init.d中没有ssh则没有安装ssh。如果存在直接重启。否则安装,建议命令行+网络方式。 如果存在,那么查看22端口是否开放 ssh localhost 出现连接拒绝的信息就说明端口有问题。 解决端口问题: 编辑/etc/ssh/ssh_config 将port 22和protocol 2,1注释掉。重启即可。
Ubuntu的root密码是多少? Ubuntu的默认root密码是随机的,即每次开机都有一个新的root密码。可以使用sudo passwd root来解决这个问题。假设安装软件后有图标,但是不知道可执行文件的路径怎么办? 可以将软件运行起来,然后ps -e |grep processname 得到进程号,接着输入ll /proc/pid。查看,存在类似exe -> /usr/bin/的信息,它即是绝对路径。ssh远程登录运行Qt,出现错误:QXcbConnection: Could not connect to display 首先,确定远端允许X11转发,将/etc/ssh/sshd_config中X11Forwarding 置成yes 然后,在本地安装xshell + xmanager。 设置xshell: 文件——属性——SSH——隧道——转发x11到——xmanager——确定 xshell远程登录后即可正常使用软件。在vi(vim)中怎样删除某一列,或者某几列,某几行? 使用visual模式,找到一个角点,按下ctrl+v,进入visual block模式,选中对角线的另一个角点,选中的部分按下x(或者 d)就能删除。root也杀不死进程?
[root@localhost test]# ps aux |grep udp1weiyang 16351 0.0 0.0 4164 348 pts/4 T 15:45 0:00 ./udp1root 18017 0.0 0.0 112640 960 pts/4 S+ 16:03 0:00 grep --color=auto udp1[root@localhost test]# kill 16351[root@localhost test]# ps aux |grep udp1weiyang 16351 0.0 0.0 4164 348 pts/4 T 15:45 0:00 ./udp1root 18020 0.0 0.0 112640 960 pts/4 S+ 16:03 0:00 grep
可以查看进程树,找一找进程间的关系:
pstree > readvi read
然后找到父进程杀死:
[root@localhost test]# ps aux |grep sshroot 1840 0.0 0.1 137904 5324 ? Ss 11:41 0:00 sshd: weiyang [priv]weiyang 1842 0.0 0.0 137904 2344 ? S 11:41 0:00 sshd: weiyang@pts/3root 2014 0.0 0.1 137904 5320 ? Ss 11:44 0:00 sshd: weiyang [priv]weiyang 2016 0.0 0.0 137904 2344 ? S 11:44 0:01 sshd: weiyang@pts/4huzheng+ 2790 0.0 0.0 52816 572 ? Ss Sep02 0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"root 3517 0.0 0.0 82488 3592 ? Ss Sep02 0:00 /usr/sbin/sshd -Droot 18229 0.0 0.0 112644 956 pts/4 S+ 16:15 0:00 grep --color=auto sshroot 47223 0.0 0.1 137904 5320 ? Ss Sep02 0:00 sshd: huzhengquan [priv]huzheng+ 47225 0.0 0.0 137904 2328 ? S Sep02 0:00 sshd: huzhengquan@pts/1
[root@localhost test]# ps aux |grep ssh |grep pts/4weiyang 2016 0.0 0.0 137904 2344 ? S 11:44 0:01 sshd: weiyang@pts/4root 18345 0.0 0.0 112644 960 pts/4 S+ 16:19 0:00 grep --color=auto ssh[root@localhost test]# kill 2016
重新远程登录后,程序udp1消失了
上面出现过的pts/4是什么东西? pts即虚拟终端. 最开始打开一个终端,他叫pts/0。 与之相关的还有tty, 有一个tty7是表示图形界面,tty1-tty6表示文字界面cp: omitting directory 省略目录错误? 自己copy的是目录,应该用递归的方式来拷贝。error: …file is busy. source insight: it is not currently avalible for write access 多半是自己仅仅给文件夹赋予了响应的权限,没有给其子目录赋予权限。
记录
linux网络, C 指针
在dos cmd中进行exe安装假设文件在H:/install 中
cd
linux查看磁盘的信息 fdisk -l设置linux ubuntu和Windows联网: 首先,插上网线。 假设Windows的网络设置为: IP: 10.21.1.109 掩码: 255.255.0.0 网关: 10.21.0.254 那么修改文件 /etc/network/interfaces 增添内容:
auto 网卡名iface 网卡名 inet staticaddress 10.21.1.110netmask 255.255.0.0gateway 10.21.0.254
再输入命令: sudo /etc/init.d/networking restart
ubuntu桌面上的软件有一部分是在/opt中的。软连接的建立: ln -s 软件所在路径 创建快捷方式的路径查看所有的端口: netstat -an (windows or linux)Linux C read()和scanf()的区别: ssize_t read(int fd, void *buf, size_t count); 对于read(STDIN_FILENO,buff,size_len),如果我们在屏幕上输入hello, 再敲入enter,那么’\n’也是存进buff了的。 也即对于:
int main(){ char s[65535]; ssize_t fid=read(STDIN_FILENO,s,65535); printf("%s%d\n",s,strlen(s)); scanf("%s",s); printf("%s%d\n",s,strlen(s)); return 0;}
有这样的结果:
hello hello6hello hello5
recvfrom和read一样。
编译错误:
error: variable-sized object may not be initializedconst int len=1<<7;char str[len]={0};
将const int len=1<<7; 改成enum{ len=1<<7 };
一次测试发现的奇怪现象:
#include
他的输出是这样的:
80 0 3 4 5
这是因为,sizeof(指针)得到的不是数组的长度而是指针的长度! 改之:
#include
C程序编译过程探究
编译过程分为如下部分: 预处理:在预处理阶段,主要完成对源代码中的预编译语句(如宏定义#define等)和文件包含进行处理。需要完成的工作是对预编译指令进行替换,把包含文件放置到需要编译的文件中。完成这些工作后,会生成一个非常完整的C程序源文件。 编译:gcc对预处理以后的文件进行编译,生成以.s为后缀的汇编语言文件。该汇编语言文件是源代码编译得到的汇编语言代码,接下来交给汇编过程进行处理。汇编语言是一种比C语言更低级的语言,可以直接对硬件进行操作。程序需要编译成汇编指令以后再编译成机器代码。 汇编:汇编过程是处理汇编语言的阶段,主要调用汇编处理程序完成将汇编语言会变成二进制机器代码的过程。通常来说,汇编过程是将.s的汇编语言代码文件汇编为.o的目标文件的过程。所生成的目标文件作为下一步链接过程的输入文件。 链接:链接过程就是将多个汇编生成的目标文件及引用的库文件进行模块链接生成一个完整的可执行文件。在链接阶段,所有的目标文件被安排在可执行程序中的适当的位置。同时,该程序所调用到的库函数也从各自所在的函数库中链接到程序中。经过了这个过程以后,生成的文件就是可执行的程序。
写一个折半查找的程序:
#include
用gcc进行预处理过程。产生文件out1gcc -E -o out1 binary_search.chead -10 out1
$ head -10 out1 # 1 "binary_search.c"# 1 "
生成汇编代码gcc -S -o out2 binary_search.cvi out2:
file "binary_search.c" .text .globl midfind .type midfind, @functionmidfind:.LFB2: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movq %rdi, -24(%rbp) movl %esi, -28(%rbp) movl %edx, -32(%rbp) movl $0, -4(%rbp) movl -32(%rbp), %eax subl $1, %eax movl %eax, -8(%rbp) movl $0, -16(%rbp) movl $-1, -12(%rbp) jmp .L2.L6: movl -4(%rbp), %eax movl -8(%rbp), %edx addl %edx, %eax sarl %eax movl %eax, -16(%rbp) movl -16(%rbp), %eax cltq leaq 0(,%rax,4), %rdx movq -24(%rbp), %rax addq %rdx, %rax movl (%rax), %eax cmpl -28(%rbp), %eax jne .L3 movl -16(%rbp), %eax movl %eax, -12(%rbp) jmp .L4.L3: movl -16(%rbp), %eax cltq leaq 0(,%rax,4), %rdx movq -24(%rbp), %rax addq %rdx, %rax movl (%rax), %eax cmpl -28(%rbp), %eax jle .L5 movl -16(%rbp), %eax subl $1, %eax movl %eax, -8(%rbp) jmp .L2.L5: movl -16(%rbp), %eax addl $1, %eax movl %eax, -4(%rbp).L2: movl -4(%rbp), %eax cmpl -8(%rbp), %eax jle .L6.L4: movl -12(%rbp), %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc.LFE2: .size midfind, .-midfind .section .rodata.LC0: .string "not found".LC1: .string "the location is %d\n".LC2: .string "%d" .text .globl main .type main, @functionmain:.LFB3: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $64, %rsp movl $2, -48(%rbp) movl $4, -44(%rbp) movl $7, -40(%rbp) movl $9, -36(%rbp) movl $12, -32(%rbp) movl $15, -28(%rbp) movl $18, -24(%rbp) movl $19, -20(%rbp) movl $20, -16(%rbp) movl $35, -12(%rbp) movl $0, -52(%rbp) jmp .L9.L11: movl -52(%rbp), %ecx leaq -48(%rbp), %rax movl $10, %edx movl %ecx, %esi movq %rax, %rdi call midfind movl %eax, -4(%rbp) cmpl $-1, -4(%rbp) jne .L10 movl $.LC0, %edi call puts jmp .L9.L10: movl -4(%rbp), %eax movl %eax, %esi movl $.LC1, %edi movl $0, %eax call printf.L9: leaq -52(%rbp), %rax movq %rax, %rsi movl $.LC2, %edi movl $0, %eax call __isoc99_scanf cmpl $-1, %eax jne .L11 movl $0, %eax leave .cfi_def_cfa 7, 8 ret .cfi_endproc.LFE3: .size main, .-main .ident "GCC: (GNU) 4.8.3 20140911 (Red Hat 4.8.3-9)" .section .note.GNU-stack,"",@progbits
生成目标代码
$ gcc -c -o out3 binary_search.c $ lsbinary_search.c out1 out2 out3$ file out3out3: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not
生成可重定位的目标代码文件out3 该文件还不能直接执行,可以尝试,不过他会输出这样的信息: bash: ./out3: Permission denied 就算是用root也会得到这样的结果。
链接生成可执行文件
gcc -o out4 out3# lsbinary_search.c out1 out2 out3 out4# file out4out4: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x36e8d6e06962c6cc0956d0a4838f46dfa94ce74b, not stripped
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~