⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 多进程1.txt

📁 本资源中含有有关LINUX进程通信的一些文章
💻 TXT
📖 第 1 页 / 共 4 页
字号:
                     sleep(2000);  /*等待中断信号*/ 
                     if (flag==1) { 
                         printf("skip system call sleep\n"); 
                         exit(0); 
                     } 
                     if (flag==2) { 
                         printf("skip system call sleep\n"); 
                         printf("waiting for next signal\n"); 
                     } 
                 } 
             } 
    11.kill() 
        功能:向一个或一组进程发送一个信号. 
        语法:#include  
             #include  
             int kill(pid,sig); 
             pid_t pid; 
             int sig; 
        说明:本系统调用向一个或一组进程发送一个信号,该信号由参数sig指 
             定,为系统给出的信号表中的一个.若为0(空信号)则检查错误但 
             实际上并没有发送信号,用于检查pid的有效性. 
             pid指定将要被发送信号的进程或进程组.pid若大于0,则信号将 
             被发送到进程号等于pid的进程;若pid等于0则信号将被发送到所 
             有的与发送信号进程同在一个进程组的进程(系统的特殊进程除 
             外);若pid小于-1,则信号将被发送到所有进程组号与pid绝对值 
             相同的进程;若pid等于-1,则信号将被发送到所有的进程(特殊系 
             统进程除外). 
             信号要发送到指定的进程,首先调用进程必须有对该进程发送信 
             号的权限.若调用进程有合适的优先级则具备有权限.若调用进程 
             的实际或有效的UID等于接收信号的进程的实际UID或用setuid() 
             系统调用设置的UID,或sig等于SIGCONT同时收发双方进程的会话 
             号相同,则调用进程也有发送信号的权限. 
             若进程有发送信号到pid指定的任何一个进程的权限则调用成功, 
             否则调用失败,没有信号发出. 
        返回值:调用成功则返回0,否则返回-1. 
        例子:假设前一个例子进程号为324,现向它发一个SIGINT信号,让它做 
             信号处理: 
             kill((pid_t)324,SIGINT); 
    12.alarm() 
        功能:设置一个进程的超时时钟. 
        语法:#include  
             unsigned int alarm(sec) 
             unsigned int sec; 
        说明:指示调用进程的超时时钟在指定的时间后向调用进程发送一个 
             SIGALRM信号.设置超时时钟时时间值不会被放入堆栈中,后一次 
             设置会把前一次(还未到超时时间)冲掉. 
             若sec为0,则取消任何以前设置的超时时钟. 
             fork()会将新进程的超时时钟初始化为0.而当一个进程用exec() 
             族系统调用新的执行文件时,调用前设置的超时时钟在调用后仍 
             有效. 
        返回值:返回上次设置超时时钟后到调用时还剩余的时间秒数. 
        例子:int flag=0; 
             void myself() 
             { 
                 flag=1; 
                 printf("get signal SIGALRM\n"); 
                 /*若要重新设置SIGALRM信号中断处理函数为本函数则执行 
                  *以下步骤*/ 
                 void (*a)(); 
                 a=myself; 
                 signal(SIGALRM,a); 
                 flag=2; 
             } 
             main() 
             { 
                 alarm(100);       /*100秒后发超时中断信号*/ 
                 while (1) { 
                     sleep(2000);  /*等待中断信号*/ 
                     if (flag==1) { 
                         printf("skip system call sleep\n"); 
                         exit(0); 
                     } 
                     if (flag==2) { 
                         printf("skip system call sleep\n"); 
                         printf("waiting for next signal\n"); 
                     } 
                 } 
             } 
    13.msgsnd() 
        功能:发送消息到指定的消息队列中. 
        语法:#include  
             #include  
             #include  
             int msgsnd(msqid,msgp,msgsz,msgflg) 
             int msqid; 
             void *msgp; 
             size_t msgsz; 
             int msgflg; 
        说明:发送一个消息到由msqid指定消息队列标识号的消息队列. 
             参数msgp指向一个用户定义的缓冲区,并且缓冲区的第一个域应 
             为长整型,指定消息类型,其他数据放在缓冲区的消息中其他正文 
             区内.下面是消息元素定义: 
               long mtype; 
               char mtext[]; 
             mtype是一个整数,用于接收进程选择消息类型. 
             mtext是一个长度为msgsz字节的任何正文,参数msgsz可从0到系 
             统允许的最大值间变化. 
             msgflg指定操作行为: 
             . 若(msgflg&IPC_NOWAIT)是真的,消息并不是被立即发送而调用 
               进程会立即返回. 
             . 若(msgflg&IPC_NOWAIT)不是真的,则调用进程会被挂起直到下 
               面情况之一发生: 
                 * 消息被发送出去. 
                 * 消息队列标志被系统删除.系统调用返回-1. 
                 * 调用进程接收到一个未被忽略的中断信号,调用进程继续 
                   执行或被终止. 
             调用成功后,对应指定的消息队列的相关结构做如下动作: 
             . 消息数(msg_qnum)加1. 
             . 消息队列最近发送进程号(msg_lspid)改为调用进程号. 
             . 消息队列发送时间(msg_stime)改为当前系统时间. 
             以上信息可用命令ipcs -a看到. 
        返回值:成功则返回0,否则返回-1. 
    14.msgrcv() 
        功能:从消息队列中取得指定类型的消息. 
        语法:#include  
             #include  
             #include  
             int msgrcv(msqid,msgp,msgsz,msgtyp,msgflg) 
             int msqid; 
             void *msgp; 
             int msgsz; 
             long msgtyp; 
             int msgflg; 
        说明:本系统调用从由msqid指定的消息队列中读取一个由msgtyp指定 
             类型的消息到由msgp指向的缓冲区中,同样的,该缓冲区的结构如 
             前所述,包括消息类型和消息正文.msgsz为可接收的消息正文的 
             字节数.若接收到的消息正文的长度大于msgsz,则会被截短到 
             msgsz字节为止(当消息标志msgflg&MSG_NOERROR为真时),截掉的 
             部份将被丢失,而且不通知消息发送进程. 
             msgtyp指定消息类型: 
             . 为0则接收消息队列中第一个消息. 
             . 大于0则接收消息队列中第一个类型为msgtyp的消息. 
             . 小于0则接收消息队列中第一个类型值不小于msgtyp绝对值且 
               类型值又最小的消息. 
             msgflg指定操作行为: 
             . 若(msgflg&IPC_NOWAIT)是真的,调用进程会立即返回,若没有 
               接收到消息则返回值为-1,errno设置为ENOMSG. 
             . 若(msgflg&IPC_NOWAIT)不是真的,则调用进程会被挂起直到下 
               面情况之一发生: 
                 * 队列中的消息的类型是有效的. 
                 * 消息队列标志被系统删除.系统调用返回-1. 
                 * 调用进程接收到一个未被忽略的中断信号,调用进程继续 
                   执行或被终止. 
             调用成功后,对应指定的消息队列的相关结构做如下动作: 
             . 消息数(msg_qnum)减1. 
             . 消息队列最近接收进程号(msg_lrpid)改为调用进程号. 
             . 消息队列接收时间(msg_rtime)改为当前系统时间. 
             以上信息可用命令ipcs -a看到. 
        返回值:调用成功则返回值等于接收到实际消息正文的字节数. 
             不成功则返回-1. 
    15.msgctl() 
        功能:消息控制操作 
        语法:#include  
             #include  
             #include  
             int msgctl(msqid,cmd,buf) 
             int msqid,cmd; 
             struct msqid_ds *buf; 
        说明:本系统调用提供一系列消息控制操作,操作动作由cmd定义,以下 
             cmd定义值表明了各操作动作的定义. 
             . IPC_STAT:将msqid相关的数据结构中各个元素的当前值放入由 
                 buf指向的结构中. 
             . IPC_SET:将msqid相关的数据结构中的下列元素设置为由buf指 
                 向的结构中的对应值. 
                 msg_perm.uid 
                 msg_perm.gid 
                 msg_perm.mode 
                 msg_qbytes 
                 本命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的 
                 进程或有效UID有合适权限的进程操作.只有具有合适权限的 
                 用户才能增加msg_qbytes的值. 
             . IPC_RMID:删除由msqid指示的消息队列.将它从系统中删除并 
                 破坏相关的数据结构. 
                 本命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的 
                 进程或有效UID有合适权限的进程操作. 
        返回值:调用成功则返回值为0,否则为-1. 
    16.msgget() 
        功能:取得一个消息队列. 
        语法:#include  
             #include  
             #include  
             int msgget(key,msgflg) 
             key_t key; 
             int msgflg; 
        说明:本系统调用返回与参数key相关的消息队列的标识符. 
             若以下事实成立,则与消息队列相关的标识符和数据结构将被创 
             建出来: 
             . 若参数key等于IPC_PRIVATE. 
             . 若参数key没有一个已存在的消息队列标识符与之相关,同时值 
               (msgflg&IPC_CREAT)为真. 
             创建消息队列时,与新的消息队列标识符相关的数据结构将被初 
             始化为如下: 
             . msg_perm.cuid和msg_perm.uid设置为调用进程的有效UID. 
             . msg_perm.cgid和msg_perm.gid设置为调用进程的有效GID. 
             . msg_perm.mode访问权限比特位设置为msgflg访问权限比特位. 
             . msg_qnum,msg_lspid,msg_lrpid,msg_stime,msg_rtime设置为0. 
             . msg_ctime设置为当前系统时间. 
             . msg_qbytes设置为系统允许的最大值. 
        返回值:调用成功则返回一非0值,称为消息队列标识符;否则返回值为-1. 
        例子:本例将包括上述所有消息队列操作的系统调用: 
             #define RKEY 0x9001L    /*读消息队列的KEY值*/ 
             #define WKEY 0x9002L    /*写消息队列的KEY值*/ 
             #define MSGFLG 0666     /*消息队列访问权限*/ 
             #define IPC_WAIT 0      /*等待方式在include文件中未定义*/ 
             int rmsqid;             /*读消息队列标识符*/ 
             int wmsqid;             /*写消息队列标识符*/ 
             struct msgbuf { 
                 long mtype; 
                 char mtext[200]; 
             } buf; 
             /*若读消息队列已存在就取得标识符,否则则创建并取得标识符*/ 
             if ((rmsqid=msgget(RKEY,MSGFLG|IPC_CREAT))<0) { 
                 printf("get read message queue failed\n"); 
                 exit(1); 
             } 
             /*若写消息队列已存在则失败,若不存在则创建并取得标识符*/ 
             if ((wmsqid=msgget(WKEY, 
                  MSGFLG|IPC_CREAT|IPC_TRUNC))<0) { 
                 printf("get write message queue failed\n"); 
                 exit(2); 
             } 
             /*接收所有类型的消息*/ 
             if (msgrcv(rmsqid,&buf,sizeof(struct msgbuf)-sizeof(long), 
                  0L,IPC_WAIT)>0) 
                 printf("get %ld type message from queue:%s\n", 
   
 
=====================================================================

进程管理的两个命令(PS,Sar) 
http://www.xici.net 作者: springwind (2001-05-11 15:04:09) 
常用的几个命令主要有: 
一、 PS 
我们可以用ps 的 – l 选项,得到更详细的进程信息. 
? F(Flag):一系列数字的和,表示进程的当前状态。这些数字的含义为: 
00:若单独显示,表示此进程已被终止。 
  01:进程是核心进程的一部分,常驻于系统主存。如:     
    sched、 vhand 、bdflush 等。 
02:Parent is tracing process. 
  04 :Tracing parent's signal has stopped the process; the parent is waiting ( ptrace(S)). 
  10:进程在优先级低于或等于25时,进入休眠状态,而且不能用信号唤醒,例如在等待一个inode被创建时    
   20:进程被装入主存(primary memory) 
   40:进程被锁在主存,在事务完成前不能被置换   e 
? S(state of the process ) 
O:进程正在处理器运行  
  S:休眠状态(sleeping) 
R:等待运行(runable)    
I:空闲状态(idle) 
  Z:僵尸状态(zombie)    
  T:跟踪状态(Traced)  
B:进程正在等待更多的内存页  
? C(cpu usage):cpu利用率的估算值  
二、 Sar:统计单CPU系统的系统活动情况 
Cpusar:多处理器系统中单个处理器的活动情况 
Mpsar:多处理器系统中处理器的总体活动情况 
? Sar -u:检查是否有逃逸进程大量占用CPU 
此命令的显示有四个字段,含义如下: 
%usr:执行用户进程的时间 
%sys:执行系统进程的时间 
%wio:等待完成I/O的时间 
%idle:空闲时间 
显示结果分析说明: 
1) 一般情况下,%usr与%sys的值基本相等 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -