本文主要展示了如下系统调用的使用说明,并做了演示程序。
getpid返回当前进程的pid,getppid则返回当前进程父进程的pid。
pid_t实质上是int类型
头文件以及函数声明如下:
#include <sys/types.h> #include <unistd.h> pid_t getpid(void); pid_t getppid(void);
#include <sys/types.h> #include <unistd.h> pid_t fork(void);
Memory writes, file mappings (mmap(2)), and unmappings (munmap(2)) performed by one of the processes do not affect the other.
这两个系统调用可以在子进程结束后回收子进程占用的全部资源,防止僵尸进程的产生。
#include <sys/types.h> #include <sys/wait.h> pid_t wait(int *wstatus);
对于waitpid函数,使用更为灵活
#include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *wstatus, int options);
#include <stdlib.h> void exit(int status);
exec()函数族会去在当前进程中调用另一个进程,执行新的进程的指令。
#include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...);
The exec() functions return only if an error has occurred. The return value is -1, and errno is set to indicate the error.
#include <sys/types.h> #include <unistd.h> #include <stdio.h> int main() { pid_t pid; for(int i = 0; i < 5; i++){ pid = fork(); if(pid == 0){ break; } sleep(1); } if(pid > 0){ while(1){ printf("父进程,pid:%d\n", getpid()); sleep(1); } } else{ printf("子进程,pid:%d, ppid:%d\n", getpid(), getppid()); } return 0; }
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { pid_t pid; for(int i = 0; i < 5; i++){ pid = fork(); if(pid == 0){ break; } sleep(1); } if(pid > 0){ while(1){ printf("父进程,pid:%d\n", getpid()); int ret = waitpid(-1, NULL, WNOHANG); if(ret > 0) printf("回收了进程%d\n", ret); sleep(1); } } else{ printf("子进程,pid:%d, ppid:%d\n", getpid(), getppid()); sleep(getpid() % 10 + 3); exit(0); } return 0; }