popen源码:
if ( (pid = fork()) == -1 ){
close(pfp[0]);
close(pfp[1]);
return NULL;
}
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)
{
{
}
#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进程对它们完成状态收集工作。