Linux

Ubuntu 16.04

常用快捷键&&常用指令

  • 调出终端Ctrl+Alt+T
  • 查看命令使用方法man [command](man为manual)或者用info command
  • q退出指令
  • Ctrl+C中断正在执行的指令
  • 指令格式command [-options] parameter1 parameter2 ...
  • /word搜索word所代表的文件
  • 关机指令 shutdown -h [time]    shutdown -c取消   shutdown -r [time]重启

root权限

启用root用户

sudo passwd -u root
#set a password
sudo passwd root

#acquire root
su root
  • 从user转到root:su root
  • 从root转到user:su [userName]

Linux文件权限

文件名为"."开头的为隐藏文档

文件
图中第①栏为 文件属性
第一个字符代表的含义

  • “d”————目录
  • “-”————文件
  • “l”————链接文件
  • “b”————可供存储的接口设备
  • “c”————串行端口设备,(鼠标,键盘

之后每三个字符为一组,依次为user,(same)group以及others(different group)的权限
权限分为 r,w,x (依次为可读,可写,可执行

在某些情况下,没有可执行权限,(即无法在 当前目录 下执行命令 即使含有r,w也被视为没有此类权限

example: A `drwx--xr-- 1 test testgroup 1024 Feb 21 15:24 testing/` B `-rw-r---w- 1 using testgroup 2048 Feb 21 15:54 test.txt` 在A中因为others没有"x",则"不可读" 而B中others"可写"

第②栏表示链接占用的节点(i-node)
第③栏表示文件拥有者
第④栏表示拥有者所在群组

vim常用指令

#关闭行号
:set nonumber
#开启行号
:set number

v 进入视图模式,选中区域进行复制(yy)粘贴(p/P)
o 为插入行
d为删除
Esc推出
:wq 写入并推出

shell

其中#开头为注释

#!/bin/bash
echo "输入1为查询,2为查找,3为退出" #控制台输出
while read func
do
if [ "$func" = "1" ];then
echo "请输入学号"
read no
#关于awk 使用shell变量如下
cat ./1710010017.bas | awk -v id="$no" '$1==id {printf ("%s\t%s\t%s\t%s\t%s\t%s\t%s\n",$1,$2,$3,$4,$5,$6,$7)}'#学号查询
elif [ "$func" = "2" ];then
#汉字替换为分数
sed -i "s/优/90/g" `grep 优 -rl ./1710010017.bas`
sed -i "s/良/80/g" `grep 良 -rl ./1710010017.bas`
sed -i "s/中/70/g" `grep 中 -rl ./1710010017.bas`
sed -i "s/差/60/g" `grep 差 -rl ./1710010017.bas`
for((i=2;i<=6;i++));
do
res=`awk 'NR=='$i'{printf("%d", $6+$7)}' 1710010017.bas` #计算总分其中 NR 为当前行的序号
sed -i ''$i's/$/\t&'$res'/g' 1710010017.bas   #增加总分列
done
sort -nk 8 -r 1710010017.bas #排序输出
else break #结束
fi
done

遇到的问题

忘记root密码

开机长按"Esc"后=>进入Ubuntu高级选项=>选择"recovery mode"=>“root”
=>输入指令mount -o rw,remount /=>通过ls /home获得账户名称
=>passwd 账户名称=>重置密码后输入exit回到导航菜单,选择"resume"继续启动系统

语言更改后

因为安装时为中文版,更改语言后重启,无法启动terminal
Ctrl+Alt+F1进入tty1登录账号
->执行命令sudo apt-get install xterm
->安装过程被打断,根据提示输入指令后
->按照论坛中的指令执行

Try to regenerate locales first:
# locale-gen

And then:
# localectl set-locale LANG="en_US.UTF-8"

And reboot.

指令

指令名称 用途 格式
chgrp(change group) 改变文件所属的组别 [groupName] [fileName]
chown(change owner) 改变文件的拥有者(若将目录下的
所有文件更改拥有者,
加"-r"参数即可
①[userName] [fileName]
② -r [userName]:[groupName] [fileName]

linux与C

进程

fork()

函数通过系统调用创建一个与原来进程几乎完全相同的进程
创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
ps 查看当前进程
kill -9 [PID]
-9 表示强迫进程立即停止

wait()

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

kill(),signal()

在linux的c程序中的kill()函数是一个用于向指定进程或进程组发送信号的函数;kill()函数原型为:int kill(int pid,int sig);

pid是一个进程或一组进程的标识符,sig是要发送的软中断信号,也就是所要发送的信号量

当pid>0时,将sig信号发送给pid进程;

当pid==0时,将sig信号发送给与发送进程同组的所有进程;

当pid==-1时,将sig信号发送给所有用户标识符真正等于发送进程的有效用户标识符的进程

在来说一下signal()函数,signal函数是一个当接受到指定信号后,转到指定的函数执行,signal()函数原型为:void(*signal(int hum,void(*func)(int)))(int);看着很可怕,简单举一个例子:

void alarming();//声明alarming函数

signal(SIGALRM,alarming);//当执行到这句话的时候,告诉执行该语句的进程,如果其他进程向此进程发送了SIGALRM信号时,就去执行alarming函数;

lseek 主要作用是移动文件读写指针
获取文件长度

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include <sys/stat.h>
#include <fcntl.h> 
void main()
{
    int fd=open("test.txt",O_RDWR);
    if(fd == -1)
    {
        perror("open test.txt");
        exit(-1);
    }
    printf("file len:%d \n",lseek(fd,0,SEEK_END));//0到文件尾
    close(fd);
} 
//lab4.cpp   fcntl
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
int main() {
int fd; 
struct flock lock;
char tmp[15];
if((fd=open("testkey",O_RDWR))==-1)return -1; 
lock.l_type=F_WRLCK;
 lock.l_whence=SEEK_SET;
 lock.l_start=0;
 lock.l_len=10;
 fcntl(fd,F_SETLKW,&lock);
 printf("parentlock..\n");
 int val=fork();
 printf("fork() is  %d\n",(int)val);//查看fork返回值
 if(val==0) {
 lock.l_type=F_WRLCK;
 lock.l_whence=SEEK_SET;
 lock.l_start=0;
 lock.l_len=10;
 printf("child waiting..\n");//查看子进程是否在等待父进程解锁
 fcntl(fd,F_SETLKW,&lock);//条件符合时锁定文件指定区域,否则等待条件出现
 printf("childlocked.\n");
 read(fd,tmp,10);
 lseek(fd,0,SEEK_SET);//将文件偏移指针移到文件头部
 write(fd,tmp+5,5);//tmp中内容写入文件
 write(fd,tmp,5);
lock.l_type=F_UNLCK;//解锁
 fcntl(fd,F_SETLK,&lock);
 printf("childunlocked.\n");
return 0; }
lseek(fd,0,SEEK_SET);
read(fd,tmp,10);
lseek(fd,0,SEEK_SET);
lock.l_type=F_UNLCK;
sleep(2);
fcntl(fd,F_SETLK,&lock);
printf("parentunlock...\n");
return 0;
}

/*
parentlock..
fork() is  3736
fork() is  0
child waiting..
parentunlock...
childlocked.
childunlocked.
*/

//lab4-1.cpp lockf
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
#include<sys/file.h>
int main(){

int fd;
char tmp[15]={};
if((fd=open("testkey",O_RDWR))==-1)return-1;
 lseek(fd,0,SEEK_SET);
 lockf(fd,F_LOCK,10);
 printf("parentlock..\n");
 int val=fork();
 printf("fork() is %d\n",(int)val);
 if(val==0) {
 lseek(fd,0,SEEK_SET);
 printf("child is waiting..\n");
 lockf(fd,F_LOCK,10);
 printf("childlocked.\n");
 read(fd,tmp,10);
 sleep(5);//休眠
 lseek(fd,0,SEEK_SET);
 write(fd,tmp+5,5);
 write(fd,tmp,5);
 lseek(fd,0,SEEK_SET);
 lockf(fd,F_ULOCK,10);
 printf("childunlocked.\n");
 return 0;
 }
 lseek(fd,0,SEEK_SET);
 read(fd,tmp,10);
 lseek(fd,0,SEEK_SET);
 lockf(fd,F_ULOCK,10);
 printf("%s\n",tmp);
 printf("parentunlock...\n");
 return 0;
}

/*
y@y-virtual-machine:~$ cat testkey
0123456789
56789ABCDE
y@y-virtual-machine:~$ gcc -o lab4-1 lab4-1.cpp
y@y-virtual-machine:~$ ./lab4-1
parentlock..
fork() is 4329
0123456789
parentunlock...
fork() is 0
child is excuting..
childlocked.
y@y-virtual-machine:~$ childunlocked.
cat testkey
5678901234
56789ABCDE
*/

参考资料

《鸟哥的Linux私房菜》
https://blog.csdn.net/u010395144/article/details/52794947
lseek
fork
signal,kill
wait

Site construction by John Doe usinghexo blog framework.
Home