su ls touch tar gcc mkdir rmdir chmod apt wc cd pwd cp kill mv grep cat more less find remove read ln rm
(1)source命令用法:
$ source shscri.sh
finished!
(2)bash命令用法:
$ bash shscri.sh
finished!
(3)./的命令用法:
$ chmod +x shscri.sh
$ ./shscri.sh
finished!
用户态:执行用户地址空间中的指令
内核态:执行内核地址空间中的指令
睡眠:执行其他进程的时间
实用时间:用户态+内核态
真实时间:用户态+内核态+睡眠
在Linux系统中,进程以时间片的形式分享CPU;同时,当进程被调度进入运行状态时,进程的执行有两种运行模式,用户态和内核态。当进程执行的是用户地址空间中的代码时,我们称进程运行于用户态;当进程进入系统调用或陷入硬件中断时,则称进程处于内核态。因此,可以从不同的角度为进程计时。
进程并非每时每刻都在运行,而是在用户态、内核态和休眠态之间切换。
脚本
#!/bin/bash
sum=0
for i in `seq 1 1000`
do
sum=$[$i+$sum]
done
echo $sum
结果
bash oneto1000add.sh
500500
测试了累乘到更大的数,溢出了最大值,结果显示为0。测试1到10的乘积,结果正确
#!/bin/bash
var=1
for i in {1..10}
do
var=$[$var*$i]
done
echo $var
结果
bash oneto1000mi.sh
3628800
包括输入输出、数学运算、字符串处理、时间日期、环境控制、内存分配、多线程并发、数据结构算法在内的很多系统函数
(1)数学函数(math.h, libm.so, libm.a)
pow(x,y)、sqrt(x)、exp(x)、log(x)、log10(x)、ceil(x)、floor(x)、fabs(x),sin、cos、tan、ctan、cosh、tanh、cosh
(2)环境控制函数
getenv\setenv\unsetenv
(3)字符串处理函数
strcat, strcpy,strncpy,bcopy,memcpy,strcmp,strncmp,strcasecmp,strncasecmp,
bzero,memset,index,strchr,rindex,strrchr,memchr,memrchr,strstr,strcasestr,strtok,
strupr,atoi,strtol,strtod
(4)时间函数
time , asctime, ctime
(5)数据结构算法函数
二分搜索: bsearch; 线性搜素:lfind,lsearch; 快速排序:qsort
二叉树算法:tsearch,tfind,twalk,tdelete,tdestroy
Linux系统在文件目录列表中:
-、常规文件
d、目录文件
c、字符设备文件
b、块设备文件
p、管道文件
l、符号链接文件
s、套接字文件
(1)用/bin/kill发送信号
(2)从键盘发送信号
(3)用kill和raise函数发送信号
(4)用alarm函数发送信号
open
int fd = open(char* filename,int flags,mode_t mode);
close
int close(int fd);
lseek
off_set lseek(int fd,off_t offset,int whence);
read
ssize_t read(int fd,void *buf,size_t n);
write
ssize write(int fd,const void *buf,size_t n);
1、mkfifo
mkfifo [OPTION]... NAME...
2、pipe
int pipe(int pipefd[2]);
1、msgget
int msgget(key_t key, int msgflg);
2、msgsnd
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
3、msgrcv
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
4、msgctl
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
1、shmget
int shmget(key_t key, size_t size, int shmflg);
2、shmat
void *shmat(int shmid, const void *shmaddr, int shmflg);
3、shmdt
int shmdt(const void *shmaddr);
4、shmctl
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
1、semget
int semget(key_t key, int nsems, int semflg);
2、semop
int semop(int semid, struct sembuf *sops, size_t nsops);
3、semctl
int semctl(int semid, int semnum, int cmd, ...);
文件描述符表(descriptor table)、文件表(file table)、 V 节点表(v-node table)
全局变量:
是定义在函数之外的变量,只有一个实例,映射到进程虚拟存储器(进程地址空间)的可读写数据区域(data段、bss段)。任何线程可以引用,最典型的共享变量,示例:sharing.c中的ptr
本地自动变量:
定义在函数内部但没有static属性的变量,函数被某个线程调用时,该函数所有本地实例变量在该线程堆栈中有一个运行实例,若多个线程执行同一个函数(或例程),该例程中的变量就拥有多个运行实例。示例:
sharing.c中main函数的本地变量tid,在主线程中有一个运行实例tid.m;
函数thread中有本地变量myid,因函数被两个对等线程p0、p1调用,有两个变量实例myid.p0, myid.p1
本地静态变量:
定义在函数内部并有static属性的变量。即使函数被多个线程调用,也仅有一个运行实例,位于进程虚拟存储器(进程地址空间)的可读写区域(data段、bss段)。示例:函数thread内部的cnt,
进程用户地址空间:所有线程共享进程的用户地址空间(或称虚拟地址空间),它是由进程可访问所有存储位置构成,包括:
main的函数原型:int main(int argc,int *argv[],char *envp[])
首先是main的栈帧,它是mian函数调用的局部变量。
接下来是命令行参数格式argc、命令行参数列表指针argv和环境变量参数列表指针envp。
再接下来就是命令行参数列表argv[]和环境变量列表envp[]。
最后,栈底是命令行参数串和环境变量串。
全局变量environ指向这些指针中的第一个envp[0]
父进程执行fork系统调用后,子进程就诞生了,新创建的子进程几乎但不完全与父进程相同:程序代码与父进程相同,变量值从父进程复制而来,接下来也从fork函数调用返回,再往下执行;不同的是,fork系统调用的返回值不同,程序代码可根据返回值判断父进程还是子进程,并据此执行不同的处理工作。Linux系统规定,父进程fork系统调用的返回值为子进程的PID,子进程的fork返回值为0,并由系统填入父子进程的数据集中。此后,子进程作为一个独立的进程开启了自己的生命周期,往下执行。
#include
#include
#include
#include
int glob=10;
int main(void){
int local;
pid_t pid;
local=8;
if((pid=fork())==0){
sleep(4);
}
else{
glob++;
local--;
sleep(10);
}
printf("pid=%d,glob=%d,local=%d\n",getpid(),glob,local);
exit(0);
}
//结果:
pid=3000,glob=10,local=8 //子进程
pid=2999,glob=11,local=7 //父进程