初学linux 进程的一些相关东西,做个笔记
1 主程序
该程序创建十个子进程,这个子进程是自己写的另外一个程序,需要传参,主要考虑几个要点:
-> 不能产生僵尸进程(在主进程运行时间很长的情况下)
在主进程一开始添加下面语句
//child_end是在子进程结束时候,主进程要调用的函数,这个函数内部对子进程等待,销毁
if(signal(SIGCHLD,child_end)==SIG_ERR)
return 1;
-> 主进程调子进程怎么传参
//exec函数族有很多,选execv示例,argv_execv中还可以再添加多个参数
// char* argv_execv[]={"task","1","2","0",NULL};
//第一个参数是可执行文件的全路径
execv("/home/ServerPush/Process/task",argv_execv)
主程序如下:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
int flag=0;
void child_end(int signum)
{
if(flag!=0)
sleep(1);
int child_status;
int pid;
flag=1;
pid = wait(&child_status);
printf("child:%d exit status: %d\n", pid, child_status);
if(WIFEXITED(child_status)==0)
printf("子进程非正常终止,子进程终止状态:%d\n",WIFEXITED(child_status));
else
printf("子进程正常终止,子进程终止状态:%d\n",WIFEXITED(child_status));
flag=0;
}
int main()
{
int child_pid;
if(signal(SIGCHLD,child_end)==SIG_ERR)
return 1;
int i;
//测试进程传参是否正确
char* argv_execv[]={"task","1","2","0",NULL};
for(i=0;i<10;i++)
{
child_pid=fork();
if(child_pid==-1)
{
printf("fork error\n");
return 2;
}else if(child_pid==0)
{
//printf("hello word %d \n",getpid());
printf("这是子进程 pid: %d\n",getpid());
if(execv("/home/ServerPush/Process/task",argv_execv) < 0 )
perror("Error on execv");
exit(1);
}
}
printf("in parent process %d\n",getpid());
for(i=1;i<10;i++)
// {
sleep(1);
// }
return 0;
}
//子程序task.c
//该程序中打印出所有传入的参数
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
int main(int argc,char* argv[],char *envp[])
{
printf("\n### ARGC ###\n%d\n", argc);
printf("\n### ARGV ###\n");
while(*argv)
printf("%s\n", *(argv++));
printf("\n### ENVP ###\n");
// while(*envp)
// printf("%s\n", *(envp++));
exit(0);
return 0;
}