进程控制操作相关的函数

    技术2022-05-19  26

        #include<unistd.h>     pid_t fork(void);     pid_t vfork(void); 创建一个新的进程,如果返回值为正数,则执行的是父进程,该值为子进程的PID,如果返回值为0,则执行的是子进程,返回-1,创建出错。 在Linux操作系统上,vfork()同fork()一样,在其他系统中,略有区别。     int execve(const char *filename, char *const argv[], char *const envp[]);     int execl( const char *path, const char *arg, ..., NULL);     int execlp( const char *file, const char *arg, ..., NULL);     int execle( const char *path, const char *arg , ...,NULL, char * const envp[]);     int execv( const char *path, char *const argv[]);     int execvp( const char *file, char *const argv[]); exec系列中的系统调用都完成相同的功能(只是参数不同而已),它们把一个新程序装入调用进程的内存空间,来改变调用进程的执行代码, 从而形成新进程。如果exec调用成功,调用进程将被覆盖,然后从新程序的入口开始执行,这样就产生了一个新的进程,但是它的进程标识符 与调用进程相同。这就是说,exec没有建立一个与调用进程并发的新进程,而是用新进程取代了原来的进程。所以,在exec调用成功后, 没有任何数据返回,这与fork()不同。     #include<stdlib.h>     int system(const char *string);     FILE *popen(const char *command, const char *type);     int pclose(FILE *stream); popen()函数同system()函数类似,不同的是popen()函数会调用pipe为程序创建一个标准的输入或者输出管道,不能同时创建。     #include<sched.h>     int __clone(int(*fn)(void *arg),void *child_stack,int flags ,void *arg); __clone函数同fork()函数作用一样,只不过__clone提供了更多的对父子进程共享的进程资源的控制。 第一个参数为子进程要执行的函数,第二个参数为指向分配给子进程的栈指针,第三个为标志,第四个为传递给子进程函数的参数指针。 具体讲解,可参见http://blog.csdn.net/caianye/archive/2010/10/17/5947282.aspx     #include<sys/types.h>     #include<sys/wait.h>     pid_t wait(int *status);     pid_t waitpid(pid_t pid, int *status, int options);     #define _USE_BSD     #include <sys/types.h>     #include <sys/resource.h>     #include <sys/wait.h>     pid_t wait3(int *status, int options,struct rusage *rusage)     pid_t wait4(pid_t pid, int *status, int options,struct rusage *rusage) wait()等待任意子进程结束,waitpid()等待由pid指向的子进程结束。遵循BSD风格的wait3()根wait4()同wait和waitpid一样。 但其还将子进程的资源使用返回到由rusage参数指针所指的结构中。     #include <signal.h>     struct sigaction {         void (*sa_handler)(int);         sigset_t sa_mask;         int sa_flags;         void (*sa_restorer)(void);     }     void (*signal(int signum, void (*handler)(int)))(int); signal()函数为信号量signum注册处理函数。     int raise (int sig);raise()将信号量sig发送到当前进程。     int killpg(int pgrp, int sig);将信号量sig发送给由pgrp指定的进程组中所有的进程。当pgrp为0时,发送给当前进程的进程组。     int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);为signal更详尽的版本     int sigprocmask(int how, const sigset_t *set,sigset_t *oldset);设置当前被阻塞的信号的掩码     int sigpending(sigset_t *set);处于等待状态的信号     int sigsuspend(const sigset_t *mask);sigsuspend函数可以暂时将当前阻塞信号集改变为由sigmask指定的信号集。 改变后,sigsuspend会等待,直到一个信号被交付。一旦一个信号被交付后,原先的信号集被恢复。 由于sigsuspend调用在信号交付之后总是被终止,它的返回值总是-1,errno总是EINTR。 void psignal(int sig, const char *s);列出信号描述和指定字符串          #include <sys/types.h>     #include <signal.h>     int kill(pid_t pid, int sig);将信号sig发送给由pid指定的进程。     #include <unistd.h>     int pause(void);让进程暂停直到信号出现     #include <string.h>     char *strsignal(int sig);返回一个指向描述信号sig的字符指针。该描述字符串或许可以在sys_siglist[]数组中被直接访问。     extern const char * const sys_siglist[];     #include <unistd.h>     void _exit(int status);     #include <stdlib.h>     void exit(int status);     int atexit(void (*function)(void));     int on_exit(void (*function)(int , void *), void *arg);     void abort(void);结束当前程序     #include <assert.h>     void assert (int expression); 该宏计算表达式,如果为false(0)则调用abort,否则不执行。定义NDEBUG宏可以使assert失效。 在程序结束前,由atexit()或者on_exit()注册的退出处理函数都会被调用。exit()函数会调用系统_exit()函数。 atexit和on_exit函数,注册退出处理函数,前者的处理函数没有参数,没有返回值,后者有参数。两者注册成功则返回0,否则返回-1     #include <sys/time.h>     struct itimerval {         struct timeval it_interval; /* next value */         struct timeval it_value;    /* current value */     };     struct timeval {         long tv_sec;/* seconds */         long tv_usec;/* microseconds */     };     int getitimer(int which, struct itimerval *value);     int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue); 具体介绍参见:http://general.blog.51cto.com/927298/368548     #include <unistd.h>     unsigned int alarm(unsigned int seconds);当seconds时间到后,发送一个SIGALRM信号     unsigned int sleep(unsigned int seconds);     void usleep(unsigned long usec); sleep和usleep函数延迟进程执行至少seconds秒或者usec毫秒。实际的延迟可能会比预计的时间长一点。     #include <unistd.h>     int nice(int inc);为调用nice的进程的动态优先级增加inc,降低其优先级。     #include <sys/time.h>     #include <sys/resource.h>     int getpriority(int which, int who);取得程序进程执行优先权 参见http://baike.baidu.com/view/1745433.htm     int setpriority(int which, int who, int prio); setpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which有三种数值,参数who 则依which值有不同定义 which           who 代表的意义 PRIO_PROCESS    who为进程识别码 PRIO_PGRP       who 为进程的组识别码 PRIO_USER       who为用户识别码 进程默认的优先权都为0,所以每个进程执行所占用的时间都差不多。为了使某个进程执行的时间更长一些,可以提高该进程的优先权。 参数prio介于-20 至20 之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。此优先权默认是0,而只有超级用户(root)允许降低此值。 返回值     执行成功则返回0,如果有错误发生返回值则为-1,错误原因存于errno。 ESRCH 参数which或who 可能有错,而找不到符合的进程 EINVAL 参数which值错误。 EPERM 权限不够,无法完成设置 EACCES 一般用户无法降低优先权 可参见:http://blog.csdn.net/billpig/archive/2010/05/09/5571718.aspx     #include <sched.h>     int sched_get_priority_max(int policy);     int sched_get_priority_min(int policy); 这两个函数分别返回最大的和最小的实时静态优先级的值,这个值由policy参数所表示的调度策略来使用。


    最新回复(0)