linux_c编程:进程(wait和waitpid函数)

等待进程结束

当子进程先于父进程退出时,如果父进程没有调用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);
}

你可能感兴趣的:(linux,进程)