Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1819827
  • 博文数量: 496
  • 博客积分: 12043
  • 博客等级: 上将
  • 技术积分: 4778
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-27 14:26
文章分类

全部博文(496)

文章存档

2014年(8)

2013年(4)

2012年(181)

2011年(303)

2010年(3)

分类: C/C++

2011-12-06 14:16:54

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) {
                     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");
                     }
                 }
             }
 

阅读(881) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~