Linux学习笔记.docx
《Linux学习笔记.docx》由会员分享,可在线阅读,更多相关《Linux学习笔记.docx(37页珍藏版)》请在冰豆网上搜索。
![Linux学习笔记.docx](https://file1.bdocx.com/fileroot1/2023-5/26/18eede6f-4eba-49c2-b7e4-722f496e4106/18eede6f-4eba-49c2-b7e4-722f496e41061.gif)
Linux学习笔记
目录权限在Linux下,将某个目录下的子目录和文件权限一次性更改的方法
在Linux下,将某个目录下的子目录和文件权限一次性更改的方法
使用命令:
chmod-Ra+rwx目录名
其中a表示针对所有人,有读(r)、写(w)、执行(x)的权限。
+表示增加权限,-表示减少权限。
a亦可以换成ugo,u表示该文件的拥有者,g表示与该文件的拥有者属于同一个组(group)者,o表示其他以外的人。
参数R即是对子目录进行相同的操作。
如:
chmod-Ra+rwx/web
文件的权限口诀:
1执2写4读
常见的文件打开方式:
1、O_RDONLY以只读的方式打开
2、O_WRONLY以只写的方式打开
3、O_RDWR以读写的方式打开
4、O_APPEND以追加的方式打开
5、O_CREAT创建一个文件
6、O_NOBLOCK非阻塞方式打开
本文是转字网上的两段,如果是菜鸟,想懂有点难度,我这里给点注释
在linux上共享文件夹windows下看
*******************************************
首先给linux设一个ip,要和windows是一个网段的
mkdir/share---------------在根下创建文件夹(除了root的目录下不能创建其他都可以)
chmod777/share/------------给share文件夹赋权
vi/etc/samba/smb.conf------------(编辑samba下的smb.conf文件)
编辑 security=share ----------一般在第58行
编辑最后面的286[weihaiyang]
287 comment=share
288 path=/share
289 validusers=nobody
290 public=yes
291 writable=yes
292 printable=no
293 createmask=0765(前面的数字是行数)
servicesmbrestart重启smb服务
然后在windows下的“运行”里输入li
fputs(””,fp)是表示向fp文件中输入字符串、fputc向文件中输入一个字符,fgets与fgetc也是同样道理
2、系统调用的方式访问文件
例如intmain(Intagrc,char*argv[])
在参数中agrc表示需要传入的参数个数,argv[i]是用来保存你所输入的参数。
注意:
[i]中的i是从1开始取值。
文件指针向前移是用-i表示向前移动i位
3、进程的特点:
1、并发性
2、动态性
3、独立性
4、异步性(进程的执行程序可以随意的)
进程的创建
在创建一个子进程后该进程与父进程共享该子进程创建下面的代码段,但子进程中的数据空间和堆栈空间是从父进程中复制过来的
Fork:
子进程拷贝父进程的数据段vfork:
子进程与父进程的共享数据段
进程间通信的方式:
1、管道(pipe)和有名管道(FIFO)
2、信号
3、消息队列
4、共享内存
5、信号量
6、套接字
管道是从头部读数据从尾部写入数据
系统命令:
使用psaux列出所有的进程pid
Memset函数是对某块内存区进行清除进行初始化。
信号发送的主要函数有kill和raise
区别:
kill既可以向自身发送信号,也可以向其他进程发送信号;而raise函数是向自身进程发送信号;
#include
#include
intkill(pid_pid,intsigno)
Intraise(intsigno);
“EOF”表示串流中无资料可读取,一般实际值为-1
共享内存:
intshmget(key_tkey,intsize,intshmflag)
key表示共享内存的键值:
0/IPC_PRIVATE
返回的是共享内存的标示符shmid
Intshmat(intshmid,char*shmaddr,intflag)
Intshmat(intshmid,00,intflag),0表示系统自己指定地址(即把该共享内存映射到调用进程的地址空间,flag为零表示共享内存为可读写)。
返回的是共享内存映射到进程的地址。
shmat
作用:
共享内存区对象映射到调用进程的地址空间
核心处理函数:
void*shmat(intshmid,char*shmaddr,intshmflag);shmat()是用来允许本进程访问一块共享内存的函数。
intshmid是那块共享内存的ID。
char*shmaddr是共享内存的起始地址
intshmflag是本进程对该内存的操作模式。
如果是SHM_RDONLY的话,就是只读模式。
其它的是读写模式
成功时,这个函数返回共享内存的起始地址。
失败时返回-1
最近用到内存共享,收集整理了些资料,做了个简单的对比
mmap系统调用
系统V共享内存
获取共享
内存ID
#include
fd=open(name ,flag,mode);
if(fd<0)
….
#include
#include
int shmget(key_t key, size_t size, int shmflg);
映射内存
ptr=mmap(NULL,len, PROT_READ|PROT_WRITE,
MAP_SHARED , fd , 0);
void *shmat( int shmid , char *shmaddr , int shmflag );
解除映射
int munmap( void * addr, size_t len ) ;
int shmdt( char *shmaddr );
使进程中的映射内存无效化,不可以使用。
但是保留空间
其它
同步:
int msync ( void * addr , size_t len, int flags);
控制:
shmctl( shmid , IPC_STAT , &buf );
// 取得共享内存的状态
shmctl( shmid , IPC_RMID , &buf );
// 删除共享内存–删除共享内存,彻底不可用,释放空间
void*memset(void*s,intc,size_tn)
总的作用:
将已开辟内存空间s的首n个字节的值设为值c。
消息队列
#include
#include
Key_tftok(char*pathname,intproj)
功能:
返回文件名的对应键值
Pathname:
文件名
Proj:
项目名
2、打开和创建
#include
#include
#include
Intmsgget(key_tkey,intmsgflg)
Key:
键值,由ftok提供
Msgflg:
标志位。
IPC_CREAT创建新的消息队列IPC_EXCL与IPC_CREAT一同使用,若要创建的消息队列已存在,则返回错误;IPC_NOWAIT读写消息队列要求无法满足时,不阻塞。
返回值:
与键值key相对应的消息队列描述字
消息队列
1. 创建消息队列
|8zGR9E7XnW`@.S;n0
#include
b8oT:
]Q)`+Q0 #include
ft"r~LI}0 #include51Testing软件测试网u"ac-I
G(c
intmsgget(key_tkey,intmsgflg);51Testing软件测试网(f+SGLYx!
u5J!
c
成功返回队列ID,失败返回-1。
51Testing软件测试网ZS0[&@*v
参数51Testing软件测试网u^5OHh6\
说明51Testing软件测试网~;N]D{p)M|
key
#t%[E+Vn\0
创建/打开队列key值,由ftok产生,可以直接给常量51Testing软件测试网2XcD&ImZ`6suOx
msgflg51Testing软件测试网0?
neK0t4um
创建/打开方式IPC_CREAT、IPC_EXCL、IPC_NOWAIT
Ye,]D\y'_0
通常是msgflg=IPC_CREAT|IPC_EXCL|0666,意思是若不存在key值的队列则创建,否则如果存在则打开队列,0666意思与一般文件权限一样,XXX-本用户,同组用户,其他用户的读写执行的权限。
I9S&I*D:
BA0 #include51Testing软件测试网d9eS
u2RFt
#include51Testing软件测试网(e#pa_lj
key_tftok(constchar*pathname,intproj_id);
1?
3z.Ai,ca#w0
//获取pathname相对应的一个键值,pathname必须是存在并且可读取的文件,proj_id表示序号,用来区别同时的存在文件。
成功返回key值,失败返回-1。
2. 队列读写
8yF1|G)mF0
#include
'hHkLV'L^}c5K0 #include
.c_%c%Hc"slW0 #include51Testing软件测试网US,^oPmx0b/D
a) 读取数据――阻塞读取消息队列,直到解除阻塞。
51Testing软件测试网fJ3C:
c_)Z
ssize_tmsgrcv(intmsqid,structmsgbuf*msgp,size_tmsgsz,longmsgtyp,intmsgflg);
@%mv4[TJj0
参数
'{/QW+B5W*yT0
说明
a%Wa1~3m6ox2[o0
msqid51Testing软件测试网+RH@/O,U]y
已打开的消息队列id51Testing软件测试网!
vA/jN"@Cwx[
msgp51Testing软件测试网xZ[W*]q'A9b
接收存放的消息队列缓存结构51Testing软件测试网"\P}
gw6GZ.F
msgsz51Testing软件测试网%s[+H9^Y*lin|
消息数据长度
sqlc(Z0
msgtyp51Testing软件测试网#H5[.|wr
消息类型。
=0读取队列中第一个数据。
zS-T!
U6n0
msgflg
y9K[eSK(K.AYdu.d0
读取标志通常使用IPC_NOWAIT:
即没有满足条件的消息,立即返回,此时,错误代码errno=ENOMSG
|SbAu/@9`0kkK0
IPC_EXCEPT:
与msgtyp>0配合使用,返回队列中第一个类型不为msgtyp的消息
H!
X/wafdO!
b)j0
MSG_NOERROR:
截断超长数据51Testing软件测试网p"PJ^sP&M
缓冲内容结构如下:
structmsgbuf{51Testing软件测试网7Hd:
fo4l)B7}-huunY+Um
longmtype; /*消息类型mustbe>0*/51Testing软件测试网;n%]nkzSr6J
charmtext[1];/*消息数据这里只是一个数组的首地址,并非是只有一个字符*/
F0f0XJ
j}0 };51Testing软件测试网'h2U%rOz8v
msgrcv()解除阻塞的条件三个条件@9o,aM9n+fe
1. 消息队列中有了满足条件的消息(或使用了);51Testing软件测试网#b*ql(tt'@
2. msqid代表的消息队列被删除;51Testing软件测试网#P}~;{7pl`&my
3. 调用msgrcv()的进程被信号中断;
[f&WH#@tvCc'r0
a) 发送数据
bsb6HmDw0
intmsgsnd(intmsqid,structmsgbuf*msgp,size_tmsgsz,intmsgflg);
W
`&Az9@0
参数
_W'Vn6Xem0
说明51Testing软件测试网{zgP.d9R"[~:
h
msqid51Testing软件测试网+S/e;lH3O_Ac
已打开的消息队列id
qTjd|5M0
msgp51Testing软件测试网!
WM,sFP4o0H8g
发送存放的消息队列缓存结构51Testing软件测试网aKG+{hpC
msgsz51Testing软件测试网lORc,YA(W"aN
消息数据长度
Bla#K_t?
0
msgflg
6~d)H.^h0
消息类型。
=0读取队列中第一个数据。
51Testing软件测试网4NA;{6@FGA
51Testing软件测试网VR.qkCT
51Testing软件测试网'EuOV&R!
?
t
51Testing软件测试网b9}/[m!
@}-C
3. 消息队列控制
|9z}2T5@;T0
#include
i9kcvQ"W(Z2rSz0 #include
Dg0q4Gu4]0 #include 51Testing软件测试网]Wv,r{plD$?
#U
intmsgctl(intmsqid,intcmd,structmsqid_ds*buf);51Testing软件测试网s-r%YIfTT
成功返回0,失败返回-1。
51Testing软件测试网3[VP9z3SE
参数
!
mWv8`#S]0
说明
n+ZbaB6Gp0
msqid
W;]&^Dg^(K0
已打开的消息队列id51Testing软件测试网S#LpIN(R)KU8`
cmd
'{4A:
O1oW0
控制类型选项51Testing软件测试网7Z9{qnba!
o
IPC_STAT:
取得队列状态51Testing软件测试网-IrIROC'f]aD
IPC_SET:
设置队列属性
+?
/P.c,e+w_x\0
IPC_RMID:
删除消息队列
g)ig9}T
te^*Y0
buf51Testing软件测试网5~@~/M'ff6a
存放队列的属性结构
(["ZX5A4wQ
[0c0
e+B0S8|u
hfj0
队列属性如下:
51Testing软件测试网Q]E1L*dU,gd
structmsqid_ds51Testing软件测试网w7o"^(~]*S6i
{
/wfjV{0iy0 structipc_permmsg_perm;/*structuredescribingoperationpermission*/51Testing软件测试网l4J*~:
U'R3\Q
__time_tmsg_stime;/*最后一次发送消息的时间*/51Testing软件测试网JK.Bw&y)PB
unsignedlongint__unused1;/*保留*/
;F8w%sA
p:
C0 __time_tmsg_rtime;/*最后一次接收数据时间*/51Testing软件测试网(T?
sD|jY
unsignedlongint__unused2; /*保留*/51Testing软件测试网3~w!
h
v!
zy!
r
__time_tmsg_ctime;/*最后修改时间*/51Testing软件测试网&cK"xf8i&T
unsignedlongint__unused3;/*保留*/
%P-dP^Y0 unsignedlongint__msg_cbytes;/*当前队列字节数*/51Testing软件测试网-j$P:
~5Z'Odr
msgqnum_tmsg_qnum;/*当前队列的消息数*/
$zMlg4Lx0 msglen_tmsg_qbytes;/*队列中容量*/51Testing软件测试网7uh1?
j:
UO3_
__pid_tmsg_lspid;/*最后发送消息的进程号*/
"P#wJ9~[+UrR0 __pid_tmsg_lrpid;/*最后接收队列的进程号*/
kU4X#Y+{a0 unsignedlongint__unused4;/*保留*/
0rAS;fc0 unsignedlongint__unused5;/*保留*/
b^7T%@|n)g.b0};
7P/x7R_aF0
4.例子:
{F7LA&b8Ued0n_i.j0
#include51Testing软件测试网PE6GV%jD}#G
#include
L*k'BX7N0ycD0#include
qi$M;Dg8]!
c9D0#definemsgkey0x1100000151Testing软件测试网2o+XnSO]1rc
structmsg_buf
:
B;{bi'd'{a0 {
:
[E!
rR#x5l,[m0 intmtype;
WNeQ7N#~8|:
B(C3V0 chardata[255];51Testing软件测试网'Pudk^(@
};
QPN?
/d0 51Testing软件测试网h
sP"XB7\Q@
intmain()51Testing软件测试网q"EOq4]RT4P
{
j!
zsF4k5M;_Z0 key_tkey;51Testing软件测试网%L~G
p{.E
intmsgid;
v0}e,iXU0r6x0 intret;51Testing软件测试网,O'm0K7J!
LPv|$~
structmsg_bufmsgbuf;
~
j.?
8fP0 51Testing软件测试网pEO6O&W?
-}
key=ftok("/tmp/1",'a');51Testing软件测试网;aU3C"x*}Btf%R.q*|5h
printf("key=[%x]\n",key);
d}[g,e8{0 //msgid=msgget(key,IPC_CREAT|IPC_EXCL|0666);/*通过文件对应*/51Testing软件测试网_;rp%P}Ft#p
msgid=msgget(msgkey,IPC_CREAT|IPC_EXCL|0666);/*或者取常量*/
te9w
r/T@
D0 if(msgid==-1)51Testing软件测试网z@&nQ"lR7[@
{51Testing软件测试网VlkY[X
printf("createerror\n");51Testing软件测试网'~o^,SJM]
return-1;
;{S/xj-nc0 }51Testing软件测试网Es8?
ij3E
p~C1Y(V
51Testing软件测试网e.G&`/OL'YHV
msgbuf.mtype=getpid();51Testing软件测试网Gq/V2rRO
strcpy(msgbuf.data,"testhaha");
+YS{!
Nv&P(G0 ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
3_+Mr!
o.u
K8jw]5H0 if(ret==-1)51Testing软件测试网4L-f1_3vr-\
{51Testing软件测试网,]to?
'K&?
8v
printf("sendmessageerr\n");51Testing软件测试网N6{a9o0kE4W
return-1;
T8d(T#io-s0 }
XkUg8]!
WX3sc3xQ0 51Testing软件测试网p#W+wGA8@*q
memset(&msgbuf,0,sizeof(msgbuf));51Testing软件测试网)~3j2Ws"hm!
b
ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT);51Testing软件测试网n:
mk.E_KB+Ef?
UW
if(ret==-1)
j#qDe#o7Z}5s!
P3R0 {51Testing软件测试网&kA)t6U&v-hsp0~
printf("recvmessageerr\n");
Z3E.Ms*a~0 return-1;51Testing软件测试网d
M8k0[q:
yt@#vU
}51Testing软件测试网(an}-q*x*H.v{2w
printf("recvmsg=[%s]\n",msgbuf.data);
t#HUWP].ay0S8eM"{0
#N6GkmqzMn0 ret=msgctl(msgid,IPC_RMID,NULL);//删除消息队列51Testing软件测试网~YWFN:
]
51Testing软件测试网5S6n^!
j;}*EzO
if(ret==-1)51Testing软件测试网D+mB_!
PJgH9rY
{
\0y6z2JJ0 printf("delmsgerr\n");
;B#~5{;M0D8I)\:
}0