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

📄 多进程编程的相关知识总结(一).txt

📁 本资源中含有有关LINUX进程通信的一些文章
💻 TXT
📖 第 1 页 / 共 5 页
字号:
             #include  
             pid_t waitpid(pid,stat_loc,options) 
             pid_t pid; 
             int *stat_loc,options; 
        说明:当pid等于-1,options等于0时,该系统调用等同于wait().否则该 

             系统调用的行为由参数pid和options决定. 
             pid指定了一组父进程要求知道其状态的子进程: 
                -1:要求知道任何一个子进程的返回状态. 
                >0:要求知道进程号为pid值的子进程的状态. 
                <-1:要求知道进程组号为pid的绝对值的子进程的状态. 
options参数为以比特方式表示的标志以或运算组成的位图,每个 

标志以字节中某个比特置1表示: 
WUNTRACED:报告任何未知而又已停止运行的指定进程号的子进 

程的状态.该子进程的状态自停止运行时起就没有被报告 
过. 
WCONTINUED:报告任何继续运行的指定进程号的子进程的状态, 

该子进程的状态自继续运行起就没有被报告过. 
WHOHANG:若调用本系统调用时,指定进程号的子进程的状态目 
前并不是立即有效的(即可被立即读取的),调用进程并被 
暂停执行. 
WNOWAIT:保持将其状态设置在stat_loc的进程在可等待状态. 
该进程将等待直到下次被要求其返回状态值. 
返回值:等待到一个子进程返回时,返回值为该子进程号,否则返回值为 

-1.同时stat_loc返回子进程的返回值. 
例子:pid_t pid; 
int stat_loc; 
/*父进程*/ 
if ((pid=fork())>0) { 
                 waitpid(pid,&stat_loc,0); 
                 /*父进程等待进程号为pid的子进程的返回*/ 
             } 
             else { 
                 /*子进程的处理过程*/ 
                 exit(1); 
             } 
             /*父进程*/ 
             printf("stat_loc is [%d]\n",stat_loc); 
             /*字符串"stat_loc is [1]"将被打印出来*/ 
    8.setpgrp() 
        功能:设置进程组号和会话号.
        语法:#include  
             pid_t setpgrp() 
        说明:若调用进程不是会话首进程.将进程组号和会话号都设置为与它 
             的进程号相等.并释放调用进程的控制终端. 
        返回值:调用成功后,返回新的进程组号. 
        例子:/*父进程处理*/ 
             if (fork()>0) { 
                 /*父进程处理*/ 
             } 
             else { 
                 setpgrp(); 
                 /*子进程的进程组号已修改成与它的进程号相同*/ 
                 exit(0); 
             } 
    9.exit() 
        功能:终止进程. 
        语法:#include  
             void exit(status) 
             int status; 
        说明:调用进程被该系统调用终止.引起附加的处理在进程被终止前全 
             部结束. 
        返回值:无 
    10.signal() 
        功能:信号管理功能 
        语法:#include  
             void (*signal(sig,disp))(int) 
             int sig; 
             void (*disp)(int); 

             void (*sigset(sig,disp))(int) 
             int sig; 
             void (*disp)(int); 

             int sighold(sig) 
             int sig; 

             int sigrelse(sig) 
             int sig; 

             int sigignore(sig) 
             int sig; 

             int sigpause(sig) 
             int sig; 
        说明:这些系统调用提供了应用程序对指定信号的简单的信号处理. 
             signal()和sigset()用于修改信号定位.参数sig指定信号(除了 
             SIGKILL和SIGSTOP,这两种信号由系统处理,用户程序不能捕捉到)
. 
             disp指定新的信号定位,即新的信号处理函数指针.可以为
             SIG_IGN,SIG_DFL或信号句柄地址. 
             若使用signal(),disp是信号句柄地址,sig不能为SIGILL,SIGTRAP

             或SIGPWR,收到该信号时,系统首先将重置sig的信号句柄为SIG_DF
L, 
             然后执行信号句柄. 
             若使用sigset(),disp是信号句柄地址,该信号时,系统首先将该 
             信号加入调用进程的信号掩码中,然后执行信号句柄.当信号句柄 

             运行结束 
             后,系统将恢复调用进程的信号掩码为信号收到前的状态.另外, 
             使用sigset()时,disp为SIG_HOLD,则该信号将会加入调用进程的 

             信号掩码中而信号的定位不变. 
             sighold()将信号加入调用进程的信号掩码中. 
             sigrelse()将信号从调用进程的信号掩码中删除. 
             sigignore()将信号的定位设置为SIG_IGN. 
             sigpause()将信号从调用进程的信号掩码中删除,同时挂起调用 
             进程直到收到信号. 
             若信号SIGCHLD的信号定位为SIG_IGN,则调用进程的子进程在终 
             止时不会变成僵死进程.调用进程也不用等待子进程返回并做相 
             应处理. 
        返回值:调用成功则signal()返回最近调用signal()设置的disp的值. 
             否则返回SIG_ERR. 
        例子一:设置用户自己的信号中断处理函数,以SIGINT信号为例: 
             int flag=0; 
             void myself() 
             { 
                 flag=1; 
                 printf("get signal SIGINT\n"); 
                 /*若要重新设置SIGINT信号中断处理函数为本函数则执行以 

                  *下步骤*/ 
                 void (*a)(); 
                 a=myself; 
                 signal(SIGINT,a); 
                 flag=2; 
             } 
             main() 
             { 
                 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"); 
                     } 
                 } 
             } 
    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 <sys/types.h> 
             #include <sys/ipc.h> 
             #include <sys/msg.h> 
             int msgrcv(msqid,msgp,msgsz,msgtyp,msgflg) 
             int msqid; 
             void *msgp; 
             int msgsz; 
             long msgtyp; 
             int msgflg; 
        说明:本系统调用从由msqid指定的消息队列中读取一个由msgtyp指定 
             类型的消息到由msgp指向的缓冲区中,同样的,该缓冲区的结构如 

⌨️ 快捷键说明

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