popen与pclose

来源:互联网 发布:怎么在淘宝注册品牌 编辑:程序博客网 时间:2024/06/05 03:59

popen源码:

if ( (pid = fork()) == -1 ){

close(pfp[0]);

close(pfp[1]);

return NULL;

}

 在这里先fork了一次,如果错误,则关闭管道读写口,然后返回。

if ( pid > 0 )

{

if (close( pfp[child_end] ) == -1 )

return NULL;

return fdopen( pfp[parent_end] , mode);

}

在父进程中如果打开管道正确,则会与文件描述符一致的文件指针。

if ( close(pfp[parent_end]) == -1 )

exit(1);

if ( dup2(pfp[child_end], child_end) == -1 )

exit(1);

if ( close(pfp[child_end]) == -1 )

exit(1);

execl( "/bin/sh", "sh", "-c", command, NULL );

exit(1);

子进程则会调用execl函数执行shell命令,execl后面的exit(1)是在execl执行失败后才会执行,所以写的是exit(1),源码果真是写的精简却不简单那!!


pclose源码:

The code sample below illustrates how the pclose() function might be implemented on a system conforming to IEEE Std 1003.1-2001.

int pclose(FILE *stream)

{

    int stat;

    pid_t pid;

    pid = (void) fclose(stream);

    while (waitpid(pid, &stat, 0) == -1) 

   {

        if (errno != EINTR){

            stat = -1;

            break;

        }

    }

    return(stat);

}

 果真是有waitpid来为僵尸进程收尸!!源码真是个好东西

#include<stdio.h>
void main()
{
FILE * fp;
char buffer[80];
fp=popen("/home/yxf/yang/qt/co_work/test.sh","r");
fgets(buffer,sizeof(buffer),fp);
printf("%s",buffer);

pclose(fp);
pclose(fp);
}

运行查看进程,出现[sh]进程,pclose后这个进程就被杀死。

所谓僵尸进程,应该和孤儿进程一同记忆。顾名思义,孤儿进程就是父进程已死,僵尸进程则是子进程已死,但是父进程依然运行。僵尸进程的危害是非常大的,因为父进程没有替子进程“收尸”,导致其在进程表(process table)中仍然占有一个位置(slot)。由于进程表资源是有限的,最终会影响系统性能,甚至是使系统瘫痪。孤儿进程则无需担心,因为孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

    僵尸进程将会导致资源浪费,而孤儿进程则不会。

   显然在popen创建的进程在父进程之前结束,并且成为了僵尸进程,还可以看出pclose绝对不是仅仅关闭管道,还要对僵尸进程进行收尸!


0 0
原创粉丝点击