linux下根文件系得统制作工具。内带shell命令

源代码在线查看: unix系统开发-系统调用-进程间高级通信.txt

软件大小: 861 K
上传用户: linux_open_lab
关键词: linux shell 根文件 制作工具
下载地址: 免注册下载 普通下载 VIP

相关代码

				UNIX系统开发-系统调用-进程间高级通信
				基本上所有的系统调用成功时返回0或正数,失败时返回负值。
				消息通信 
				每个消息队列都有一个msqid_ds类型的控制结构,该结构中包括对消息队列的访问权限,其数据结构如下:
				struct msqid_ds
				{
				struct ipc_perm msg_perm; /*操作权限结构 */
				struct msg msg_first; /*指向消息队列的第一个结构*/
				struct msg msg_last; /*指向消息队列的最后一个结构*/
				ushort msg_cbytes; /*队列中当前字节数*/
				ushort msg_qnum; /*队列中消息数*/
				ushort msg_qbytes; /*队列可容纳的最大字节数*/
				ushort msg_lspid; /*最后发送消息的进程号*/
				ushort msg_lrpid; /*最后接收消息的进程号*/
				ushort msg_stime; /*最后发送时间*/
				ushort msg_rtime; /*最后接收时间*/
				time_t msg_ctime; /*消息队列最后修改时间*/
				};
				msgget系统调用的格式
				#include 
				#include 
				#include 
				int msgget(key,msgflg)
				key_t key; /*消息队列关键字*/
				int msgflags; /*创建标志和访问方式(类似于文件访问权限)*/
				参数与功能说明:
				msgflg低9位类似于文件访问权限的低9位,其他位指明消息队列的建立方式:
				若指定的关键字消息队列不存在,msgflg&IPC_CREAT为真,则为他建立一个新的消息队列; msgflg&IPC_CREAT为假,返回-1。若指定的关键字消息队列存在,则返回该消息队列的描述符。
				若msgflg&IPC_CREAT&IPC_EXCL为真,若指定的关键字消息队列不存在,失败返回-1;否则正常返回。
				若key等于IPC_PRIVATE,则msgget调用总是成功的。
				msgsnd系统调用的格式
				#include 
				#include 
				#include 
				int msgsnd(msqid,msgp,msgsz,msgflg)
				int msqid; /*消息队列关键字*/
				struct msgbuf msgp; /指向消息缓冲的指针*/
				int msgsz,msgflg; /*消息大小、发送标志*/
				参数与功能说明:
				发送一个消息到相关的消息队列上。其中msgp指向消息结构,他的基本格式是:
				struct msgbuf
				{
				int mtype; /*消息类型*/
				char mtext[];/*消息正文*/
				}
				msgflg具体含义为:
				msgflg&IPC_NOWAIT为真,那么如果操作条件不满足,则出错返回-1;
				msgflg&IPC_NOWAIT为假,那么如果操作条件不满足,则睡眠等待。;
				msgrcv系统调用的格式
				#include 
				#include 
				#include 
				int msgrcv(msqid,msgp,msgsz,msgtyp,msgflg)
				int msqid; /*消息队列关键字*/
				struct msgbuf msgp; /指向消息缓冲的指针*/
				int msgsz,msgflg; /*消息大小、发送标志*/
				long msgtyp; /*消息接收类型*/
				参数与功能说明:
				从消息队列中接收一个消息。其中msgp指向消息结构,他的基本格式是:
				struct msgbuf
				{
				int mtype; /*消息类型*/
				char mtext[];/*消息正文*/
				}
				msgflg具体含义为:
				msgflg&IPC_NOWAIT为真,那么如果接收的消息没有到达,则出错返回-1;
				msgflg&IPC_NOWAIT为假,那么如果接收的消息没有到达,则睡眠等待。;
				msgflg&MSG_NOERROR为真,那么如果msgrcv中的msgsz参数小于所接收的消息正文的长度,则本次可以接收msgsz字节,并且不把这种情况视为出错。
				msgtyp的取值及含义为:]
				msgtyp>0时,接收消息队列中类型为msgtyp的第一个消息。
				msgtyp=0时,接收消息队列中的第一个消息。
				msgtyp				msgctl系统调用的格式
				#include 
				#include 
				#include 
				int msgctl(msqid,cmd,buf)
				int msqid; /*消息队列关键字*/
				int cmd ; /控制命令*/
				struct msqid_ds *buf; /*指向消息队列控制块的指针*/
				参数与功能说明:
				根据控制命令cmd对msqid消息队列进行相应的控制。参数buf是指向用户程序地址空间中一个msqid_ds结构的指针,以便将相关控制信息在核心和用户地址空间之间进行传送。
				cmd控制命令的取值及含义如下:
				IPC_STAT:将指定消息队列的控制块信息写到buf结构中。
				IPC_SET:将buf中信息写到指定消息队列的控制块中。
				IPC_RMID:删除指定消息队列,释放消息队列标志符。
				共享内存段 
				每个共享内存段都有一个shmid_ds类型的控制结构,该结构中包括对共享内存段的访问权限,其数据结构如下:
				struct shmid_ds
				{
				struct ipc_perm shm_perm; /*操作权限结构 */
				int shm_segsz; /*以字节为单位的共享段大小*/
				struct region *shm_reg; /*指向共享段的指针*/
				char pad[4]; /*系统使用*/
				ushort shm_lpid; /*最后使用shmop的时间*/
				ushort shm_cpid; /*创建进程的id*/
				ushort shm_nattch; /*系统使用*/
				ushort shm_cnattc; /*系统使用*/
				time_t shm_atime; /*最后使用shmat的时间*/
				time_t shm_dtime; /*最后使用shmdt的时间*/
				time_t shm_ctime; /*共享内存段最后修改时间*/
				}; 
				shmget系统调用的格式
				#include 
				#include 
				#include 
				int shmget(key,size,shmflg)
				key_t key; /*共享内存段关键字*/
				int size; /*共享内存段大小*/
				int shmflag; /*创建标志和访问方式(类似于文件访问权限)*/
				参数与功能说明:
				shmflg低9位类似于文件访问权限的低9位,其他位指明消息队列的建立方式:
				若指定的关键字消息队列不存在,shmflg&IPC_CREAT为真,则为他建立一个新的消息队列; shmflg&IPC_CREAT为假,返回-1。若指定的关键字消息队列存在,则返回该消息队列的描述符。
				若shmflg&IPC_CREAT&IPC_EXCL为真,若指定的关键字消息队列不存在,失败返回-1;否则正常返回。
				若key等于IPC_PRIVATE,则shmget调用总是成功的。
				shmat系统调用的格式
				#include 
				#include 
				#include 
				int shmat(shmid,addr,shmflg)
				int shmid; /*共享内存段标志符*/
				char *addr; /*用户指定的一个进程虚拟空间的地址,该共享内存段附在这个地址之后*/
				int shmflg; /*创建标志和访问方式(类似于文件访问权限)*/
				参数与功能说明:
				shmat调用将标志符为shmid的共享内存段映射到进程的虚拟数据空间中,其首地址与参数addr有关。Shmflg为映射标志,说明以何种方式映射及映射到何处。Shmat正常返回该共享内存段在进程虚拟数据空间中的首地址,并且共享内存段访问计数加一;错误返回-1。
				shmdt系统调用的格式
				#include 
				#include 
				#include 
				int shmdt(addr)
				char *addr; /*用户指定的一个进程虚拟空间的地址,该共享内存段附在这个地址之后*/
				参数与功能说明:
				shmdt调用将共享内存段脱离到进程的虚拟数据空间中,参数addr是shmat的返回值。shmdt正常返回0,并且共享内存段访问计数减一;错误返回-1。
				shmctl系统调用的格式
				#include 
				#include 
				#include 
				int shmctl(shmid,cmd,buf)
				int shmid; /*共享内存段关键字*/
				int cmd ; /控制命令*/
				struct shmid_ds *buf; /*指向共享内存段控制块的指针*/
				参数与功能说明:
				根据控制命令cmd对shmid所指定的共享内存段进行相应的控制。参数buf是指向用户程序地址空间中一个shmid_ds结构的指针,以便将相关控制信息在核心和用户地址空间之间进行传送。
				cmd控制命令的取值及含义如下:
				IPC_STAT:将指定共享内存段的控制块信息写到buf结构中。
				IPC_SET:将buf中信息写到指定共享内存段的控制块中。
				IPC_RMID:删除指定共享内存段,释放共享内存段标志符。
				SHM_LOCK:将共享内存段锁定在内存,禁止换出(只有特权用户才能这样用)
				SHM_UNLOCK:将共享内存段解锁,允许换出(只有特权用户才能这样用)
				信号量 
				每个信号量组都有一个semid_ds类型的控制结构,该结构中包括对信号量组的访问权限,其数据结构如下:
				struct semid_ds
				{
				struct ipc_perm sem_perm; /*操作权限结构 */
				struct sem sem_base; /*指向信号量组的第一个信号量*/
				ushort sem_nsems; /*信号量数*/
				time_t sem_otime; /*最后使用semop的时间*/
				time_t sem_ctime; /*共享内存段最后修改时间*/
				}; 
				semget系统调用的格式
				#include 
				#include 
				#include 
				int semget(key,nsems,shmflg)
				key_t key; /*信号量组关键字*/
				int nsems; /*信号量组 个数*/
				int shmflag; /*创建标志和访问方式(类似于文件访问权限)*/
				参数与功能说明:
				semget用来创建一个信号量组,其中包含了nsems个信号量,他们的编号是0-nsems-1。信号量组的创建方式及访问权限由semflg决定,其取值与含义与msgget中的msgflg类似。
				semop系统调用的格式
				#include 
				#include 
				#include 
				int semop(semid,sops,nsops)
				int semid; /*信号量组标志符*/
				struct sembuf *sops; /*信号量操作缓冲区*/
				unsigned nsops; /*操作的信号量个数*/
				参数与功能说明:
				semop完成对标志符为semid的信号量组中信号量的操作。每次调用semop可以对指定信号量组中的若干信号量进行操作,这被称为信号量"块操作"。参数nsops说明信号量块操作时信号量的个数。Sops是指向sembuf结构的指针,该结构定义了信号量块操作时要操作的信号量编号及操作数。
				struct sembuf
				{
				int sem_num; /*信号量编号*/
				int semop; /*信号量操作数*/
				int sem_flg; /*操作标志 */
				} *sops[nsops];
				该结构中的sem_flg为操作标志,sem_op为信号量操作数,该操作对semid信号量组中编号为sem_num的信号量进行操作。Sem_op允许取三种值,其含义如下:
				sem_op > 0:将相应信号量的值增加sem_op,如果sem_flg&SEM_UNDO为真,则信号量的调整值件去sem_op;
				sem_op = 0:本次操作要对信号量的值做测试,若为0,则立即正常返回。若不为0,则进程开始睡眠,直到其值为0。当sem_flg设置标志IPC_NOWAIT时,进程并不睡眠,而是返回错误。
				sem_op < 0:此时的操作依据以下两个条件分别处理:
				若信号量当前值>=|sem_op|,则信号量的当前值便减去|sem_op|成为该信号量的新值,又若sem_flg&SEM_UNDO为真,则信号量的调整值加上|sem_op|。 
				若信号量当前值				若信号量当前值				semctl系统调用的格式
				#include 
				#include 
				#include 
				int semctl(semid,semnum.cmd,arg)
				int semid; /*信号量组关键字*/
				int semnum; /* 信号量编号*/
				int cmd ; /控制命令*/
				union semun
				{
				int val;
				struct semid_ds *buf; /指向信号量组控制块的指针*/
				ushort array[];
				}arg; /*控制操作参数*/
				参数与功能说明:
				用来对指定的信号量组或组中编号为semnum的信号量进行控制。
				cmd控制命令的取值及含义如下:
				GETVAL:取信号量(semid,semnum)的当前值到arg.val
				SETVAL:将信号量(semid,semnum)的当前值置为arg.val的值。
				GETPID:把对信号量(semid,semnum)作最后操作的进程pid的值取到arg.val中。
				GETNCNT:把在信号量(semid,semnum)上因资源不够,而睡眠的进程个数的值取到arg.val中。
				GETZCNT:把在信号量(semid,semnum)上因还有共享资源而睡眠的进程个数的值取到arg.val中。
				GETALL:把信号量组中所有信号量的当前值取到arg.array[]中。
				SETALL:把信号量组中所有信号量的值分别设为arg.array[]中的值。
				IPC_STAT:将指定信号量组的控制块信息写到buf结构中。
				IPC_SET:将buf中信息写到指定信号量组的控制块中。
				IPC_RMID:删除指定信号量组,释放信号量组标志符。
				
				
				
				
				
				
				
				
				
				
				
				
				
							

相关资源