回调函数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
char *tmp = NULL;
void clean(void)
{
printf("this is clean %s\n",tmp);
free(tmp);
}
int main(int argc, const char *argv[])
{
atexit(clean);//一会程序退了你帮我调用一下clean
tmp = (char*)malloc(50);
strcpy(tmp,"hello");
printf("123123\n");
return 0;
}
结果为:
僵尸进程的回收:(儿子死了,爸爸回收)代码如下
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
pid_t pid = fork();
if(pid>0)
{
printf("father pid:%d ppid:%d\n",getpid(),getppid());
pid_t recycle_pid = wait(NULL);
printf("recycle pid %d\n",recycle_pid);
sleep(10);
printf("aaa\n");
}
else if(0 == pid)
{
sleep(3);
printf("child pid:%d ppid:%d\n",getpid(),getppid());
exit(0);
}
else
{
perror("fork");
return 1;
}
return 0;
}
结果为:
僵尸进程儿子正常死掉和不正常死掉两种情况,对应两种输出,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
pid_t pid = fork();
if(pid>0)
{
//stat("1.txt",&st);
int status;
printf("father pid:%d ppid:%d\n",getpid(),getppid());
pid_t recycle_pid = wait(&status);
if(WIFEXITED(status))
{
printf("child normal terminal,recycle pid %d , exit value %d\n"
,recycle_pid,WEXITSTATUS(status));
}
if(WIFSIGNALED(status))
{
printf("child terminal bu signal ,rrecycle pid %d, signal num %d \n"
,recycle_pid,WTERMSIG(status));
}
}
else if(0 == pid)
{
printf("child pid:%d ppid:%d\n",getpid(),getppid());
sleep(5);
exit(20);
}
else
{
perror("fork");
return 1;
}
return 0;
}
结果为:
要用kill -9 pid号杀死儿子
非阻塞方式回收:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
pid_t pid = fork();
if(pid>0)
{
//stat("1.txt",&st);
int status;
printf("father pid:%d ppid:%d\n",getpid(),getppid());
while(1)
{
pid_t recycle_pid = waitpid(pid,&status,WNOHANG );
if(recycle_pid == pid)
{
if(WIFEXITED(status))
{
printf("child normal terminal,recycle pid %d , exit value %d\n"
,recycle_pid,WEXITSTATUS(status));
}
if(WIFSIGNALED(status))
{
printf("child terminal bu signal ,rrecycle pid %d, signal num %d \n"
,recycle_pid,WTERMSIG(status));
}
break;
}
else
{
printf("子进程未结束,稍后在试\n");
}
}
}
else if(0 == pid)
{
printf("child pid:%d ppid:%d\n",getpid(),getppid());
sleep(5);
exit(20);
}
else
{
perror("fork");
return 1;
}
return 0;
}
运行结果为:
exec
execute可执行的
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
// firefox www.taobao.com
execl("/usr/bin/firefox","firefox","www.taobao.com",NULL);
printf("看见就错了\n");
return 0;
}
运行就可以上网了!!!