Linux C编程源代??2)--进程控制(fork调用-wait调用-僵尸进程-exec...

来源:百度文库 编辑:神马文学网 时间:2024/04/27 16:12:02
第8章 进程控制
返回当前进程ID
#include
int main()
{
printf("The current process ID is %d\n",getpid());
exit(0);
}
8.2 fork调用(调用成功时对父进程返回子进程的PID,对子进程返回0,调用失败时返回-1)
#include
#include
#include
#include
#include
#include
#include
#include
extern int errno;
int main()
{
char buf[100];
pid_t cld_pid;
int fd;
int status;
if ((fd=open("temp",O_CREAT|O_TRUNC | O_RDWR,S_IRWXU)) == -1)
{
printf("open error %d",errno);
exit(1);
}
strcpy(buf,"This is parent process write\n");
if ((cld_pid=fork()) == 0)
{ /* 这里是子进程执行的代码 */
strcpy(buf,"This is child process write\n");
printf("This is child process\n");
printf("My PID(child) is %d\n",getpid()); /*打印出本进程的ID*/
printf("My parent PID is %d\n",getppid()); /*打印出父进程的ID*/
write(fd,buf,strlen(buf));
close(fd);
exit(0);
}
else
{ /* 这里是父进程执行的代码 */
printf("This is parent process\n");
printf("My PID(parent) is %d\n",getpid()); /*打印出本进程的ID */
printf("My child PID is %d\n",cld_pid); /*打印出子进程的ID*/
write(fd,buf,strlen(buf));
close(fd);
}
wait(&status);
}
exec实例
#include
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++));
return 0;
}
#include
main()
{
char *envp[]={"PATH=/tmp",
"USER=lei",
"STATUS=testing",
NULL};
char *argv_execv[]={"echo", "excuted by execv", NULL};
char *argv_execvp[]={"echo", "executed by execvp", NULL};
char *argv_execve[]={"env", NULL};
if(fork()==0)
if(execl("/bin/echo", "echo", "executed by execl", NULL)<0)
perror("Err on execl");
if(fork()==0)
if(execlp("echo", "echo", "executed by execlp", NULL)<0)
perror("Err on execlp");
if(fork()==0)
if(execle("/usr/bin/env", "env", NULL, envp)<0)
perror("Err on execle");
if(fork()==0)
if(execv("/bin/echo", argv_execv)<0)
perror("Err on execv");
if(fork()==0)
if(execvp("echo", argv_execvp)<0)
perror("Err on execvp");
if(fork()==0)
if(execve("/usr/bin/env", argv_execve, envp)<0)
perror("Err on execve");
}
僵尸进程
#include
#include
main()
{
pid_t pid;
pid=fork();
if(pid<0) /* 如果出错 */
printf("error occurred!\n");
else if(pid==0) /* 如果是子进程 */
exit(0);
else   /* 如果是父进程 */
sleep(60); /* 休眠60秒,这段时间里,父进程什么也干不了 */
wait(NULL); /* 收集僵尸进程 */
}
wait调用
#include
#include
#include
#include
main()
{
pid_t pc,pr;
pc=fork();
if(pc<0)    /* 如果出错 */
printf("error ocurred!\n");
else if(pc==0){   /* 如果是子进程 */
printf("This is child process with pid of %d\n",getpid());
sleep(10); /* 睡眠10秒钟 */
}
else{    /* 如果是父进程 */
pr=wait(NULL); /* 在这里等待 */
printf("I catched a child process with pid of %d\n"),pr);
}
exit(0);
}
实战参数status [ pit_t wait(int *status) ]
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char **argv)
{
int status;
pid_t pc,pr;
pc=fork();
if(pc<0) /* 如果出错 */
printf("error ocurred!\n");
else if(pc==0){ /* 子进程 */
printf("This is child process with pid of %d.\n",getpid());
exit(3); /* 子进程返回3 */
}
else{   /* 父进程 */
pr=wait(&status);
if(WIFEXITED(status)){ /* 如果WIFEXITED返回非零值 ,提取子进程的返回值如果调用exit(5)则返回5*/
printf("the child process %d exit normally.\n",pr);
printf("the return code is %d.\n",WEXITSTATUS(status));
}else    /* 如果WIFEXITED返回零 */
printf("the child process %d exit abnormally.\n",pr);
}
return 0;
}
waitpid实例
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv)
{
pid_t pc, pr;
pc=fork();
if(pc<0)   /* 如果fork出错 */
printf("Error occured on forking.\n");
else if(pc==0){   /* 如果是子进程 */
sleep(10); /* 睡眠10秒 */
exit(0);
}
/* 如果是父进程 */
else{
do{
pr=waitpid(pc, NULL, WNOHANG); /* 使用了WNOHANG参数,waitpid不会在这里等待 */
if(pr==0){    /* 如果没有收集到子进程 */
printf("No child exited\n");
sleep(1);
}
}while(pr==0);   /* 没有收集到子进程,就回去继续尝试 */
if(pr==pc)
printf("successfully get child %d\n", pr);
else
printf("some error occured\n");
}
}