当子进程先于父进程退出时,如果父进程没有调用wait和waitpid函数,子进程就会进入僵尸状态
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *statloc)
pid_t waitpid(pid_t pid, int *statloc, int options)
//wait函数的返回值是终止运行的子进程的pid,参数statloc存放的是子进程的退出码,状态信息将被写入statloc所指向的变量
//wait函数也会来等待子进程的结束,但它用于等待某个特定的子进程的pid,statloc和wait的含义相同,option如果被设置为WNOHANG,则父进程不被挂起而立即执行后面的代码
如果想让父进程周期性的检查某个特定子进程是否退出,可以写如下代码:
waitpid(child pid, (int *)0, WNOHANG)
如果子进程未退出则返回0,子进程已经结束,返回childpid,失败返回-1
- 获得进程id
#include<sys/types.h>
#include<unistd.h>
pid_t getpid(void)
- setuid和setgid
#include<sys/types.h>
#include<unistd.h>
int setuid(int uid)
int setgid(int gid)
//若进程具有root权限,则函数会将实际用户id,有效用户id设置为参数uid
//若进程不具有root权限,但uid等于实际用户id,则setuid只将有效用户id设置为uid,不改变实际用户id
//若两个条件都不满足,则函数调用失败,返回-1
//setgid和setuid相似
- 改变进程的优先级
#include<sys/resource.h>
int nice(int increment)
{
int old = getpriority(PRIO_PROCESS, getpid())
return setpriority(PRIO_PROCESS, getpid(), oldpro + increment)
}
//代表进程优先级的数字越小,表示进程优先级越高
进程优先级的改变的具体参数用法感兴趣的朋友可以自行百度,这里不再讨论
附源码:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/resource.h>
#include<sys/wait.h>
int main()
{
int pid;
int stat_val = 0;
int oldpri, newpri;
pid = fork();
switch(pid)
{
case -1:
perror("fork\n");
exit(1);
case 0:
printf("Child is running, Curpid is %d, ParentPid is %d\n", pid, getppid());
oldpri = getpriority(PRIO_PROCESS, getpid());
printf("Old priority = %d\n", oldpri);
newpri = nice(2);
printf("New priority = %d\n", newpri);
exit(0);
default:
printf("Parent is running, Childpid is %d, ParentPid is %d\n", pid, getpid());
break;
}
wait(&stat_val);
exit(0);
}