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

📄 多进程1.txt

📁 本资源中含有有关LINUX进程通信的一些文章
💻 TXT
📖 第 1 页 / 共 4 页
字号:
             int system(string) 
             char *string; 
        说明:本调用将参数string传递给一个命令解释器(一般为sh)执行, 即 
             string被解释为一条命令, 由sh执行该命令.若参数string为一 
             个空指针则为检查命令解释器是否存在. 
             该命令可以同命令行命令相同形式, 但由于命令做为一个参数放 
             在系统调用中, 应注意编译时对特殊意义字符的处理. 命令的查 
             找是按PATH环境变量的定义的. 命令所生成的后果一般不会对父 
             进程造成影响. 
        返回值:当参数为空指针时, 只有当命令解释器有效时返回值为非零. 
             若参数不为空指针, 返回值为该命令的返回状态(同waitpid()) 
             的返回值. 命令无效或语法错误则返回非零值,所执行的命令被 
             终止. 其他情况则返回-1. 
        例子:char command[81]; 
             int i; 
             for (i=1;i<8;i++) { 
                 sprintf(command,"ps -t tty%02i",i); 
                 system(command); 
             } 
    3.exec() 
        功能:执行一个文件 
        语法:#include  
             int execl(path,arg0,...,argn,(char*)0) 
             char *path,*arg0,...,*argn; 

             int execv(path,argv) 
             char *path,*argv[]; 

             int execle(path,arg0,...,argn,(char*)0,envp) 
             char *path,*arg0,...,*argn,*envp[]; 

             int execve(path,argv,envp) 
             char *path,*argv[],*envp[]; 

             int execvp(file,argv) 
             char *file,*argv[]; 
        说明:这是一个系统调用族, 用于将一个新的程序调入本进程所占的内 
             存, 并覆盖之, 产生新的内存进程映象. 新的程序可以是可执行 
             文件或SHELL批命令. 
             当C程序被执行时,是如下调用的: 
             main(int argc,char *argv[],char *envp[]); 
             argc是参数个数,是各个参数字符串指针数组,envp是新进程的环 
             境变量字符串的指针数组.argc至少为1,argv[0]为程序文件名, 
             所以,在上面的exec系统调用族中,path为新进程文件的路径名, 
             file为新进程文件名,若file不是全路径名,系统调用会按PATH环 
             境变量自动找对应的可执行文件运行.若新进程文件不是一个可 
             执行的目标文件(如批处理文件),则execlp()和execvp()会将该 
             文件内容作为一个命令解释器的标准输入形成system(). 
             arg0,...等指针指向'\0'结束的字符串,组成新进程的有效参数, 
             且该参数列表以一个空指针结束.反过来,arg0至少必须存在并指 
             向新进程文件名或路径名. 
             同样,argv是字符串指针数组,argv[0]指向新进程文件名或路径 
             名,并以一空指针结束. 
             envp是一个字符串指针数组,以空指针结束,这些字符串组成新进 
             程的环境. 
             在调用这些系统调用前打开的文件指针对新进程来说也是打开的, 
             除非它已定义了close-on-exec标志.打开的文件指针在新进程中 
             保持不变,所有相关的文件锁也被保留. 
             调用进程设置并正被捕俘的信号在新进程中被恢复为缺省设置, 
             其它的则保持不变. 
             新进程启动时按文件的SUID和SGID设置定义文件的UID和GID为有 
             效UID和GID. 
             新进程还继承了如下属性: 
             . 附加GID. 
             . 进程号. 
             . 父进程号. 
             . 进程组号. 
             . 会话号. 
             . 控制终端. 
             . alarm时钟信号剩下的时间. 
             . 当前工作目录. 
             . 根目录. 
             . 文件创建掩码. 
             . 资源限制. 
             . 用户时间,系统时间,子进程用户时间,子进程系统时间. 
             . 记录锁. 
             . 进程信号掩码. 
             . 信号屏蔽. 
             . 优先级. 
             . 预定值. 
             调用成功后,系统调用修改新进程文件的最新访问时间. 
        返回值:该系统调用一般不会有成功返回值, 因为原来的进程已荡然无 
             存. 
        例子:printf("now this process will be ps command\n"); 
             execl("/bin/ps","ps","-ef",NULL); 
    4.popen() 
        功能:初始化从/到一个进程的管道. 
        语法:#include  
             FILE *popen(command,type) 
             char *command,type; 
        说明:本系统调用在调用进程和被执行命令间创建一个管道. 
             参数command做为被执行的命令行.type做为I/O模式,"r"为从被 
             执行命令读,"w"为向被执行命令写.返回一个标准流指针,做为管 
             道描述符,向被执行命令读或写数据(做为被执行命令的STDIN或 
             STDOUT)该系统调用可以用来在程序中调用系统命令,并取得命令 
             的输出信息或者向命令输入信息. 
        返回值:不成功则返回NULL,成功则返回管道的文件指针. 
    5.pclose() 
        功能:关闭到一个进程的管道. 
        语法:#include  
             int pclose(strm) 
             FILE *strm; 
        说明:本系统调用用于关闭由popen()打开的管道,并会等待由popen() 
             激活的命令执行结束后,关闭管道后读取命令返回码. 
        返回值:若关闭的文件描述符不是由popen()打开的,则返回-1. 
        例子:printf("now this process will call popen system call\n"); 
             FILE * fd; 
             if ((fd=popen("ps -ef","r"))==NULL) { 
                 printf("call popen failed\n"); 
                 return; 
             } 
             else { 
                 char str[80]; 
                 while (fgets(str,80,fd)!=NULL) 
                     printf("%s\n",str); 
             } 
             pclose(fd); 
    6.wait() 
        功能:等待一个子进程返回并修改状态 
        语法:#include  
             #include  
             pid_t wait(stat_loc) 
             int *stat_loc; 
        说明:允许调用进程取得子进程的状态信息.调用进程将会挂起直到其 
             一个子进程终止. 
        返回值:等待到一个子进程返回时,返回值为该子进程号,否则返回值为 
             -1.同时stat_loc返回子进程的返回值. 
        例子:/*父进程*/ 
             if (fork()>0) { 
                 wait((int *)0); 
                 /*父进程等待子进程的返回*/ 
             } 
             else { 
                 /*子进程处理过程*/ 
                 exit(0); 
             } 
    7.waitpid() 
        功能:等待指定进程号的子进程的返回并修改状态 
        语法:#include  
             #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_DFL, 
             然后执行信号句柄. 
             若使用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) { 

⌨️ 快捷键说明

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