日期:2014-05-16  浏览次数:21073 次

Linux学习记录--进程控制相关系统调用

系统调用:进程控制


fork系统调用


函数作用:创建一个子进程

形式:pid_tfork(void);

pid_t vfork(void);

说明:使用vfork创子进程时,不会进程父进程的上下文

返回值:[返回值=-1]子进程创建失败

                 [返回值=0]子进程创建成功

                [返回值>0]对父进程返回子进程PID


举例:

#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
int main() {
	pid_t id = fork();
	if (id < 0) {
		perror("子进程创建失败!");
	} else {
		if (id == 0) {
			printf("子进程工作:PID=%d,PPID=%d\n", getpid(), getppid());
		}else
		{
			printf("父进程工作:PID=%d,PPID=%d,子进程PID=%d\n", getpid(), getppid(),id);
			sleep(5)
		}
	}
}

控制台输出

父进程工作:PID=3173,PPID=2432,子进程PID=3176

子进程工作:PID=3176,PPID=3173


exit系统调用


函数作用:终止发出调用的进程

形式:voidexit(int status);

说明

1.      exit返回信息可由wait系统函数获得

2.      如果父进程先退出子进程的关系被转到init进程下

#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
	pid_t id = fork();
	if (id < 0) {
		perror("子进程创建失败!");
	} else {
		if (id == 0) {
			printf("子进程工作:PID=%d,PPID=%d\n", getpid(), getppid());
			sleep(20);
			printf("此时子进程:PID=%d,PPID=%d\n", getpid(), getppid());
		}else
		{
			printf("父进程工作:PID=%d,PPID=%d,子进程PID=%d\n", getpid(), getppid(),id);
			sleep(5);
			exit(3);
		}
	}
	return 0;
}

控制台输出

父进程工作:PID=3068,PPID=2432,子进程PID=3071

子进程工作:PID=3071,PPID=3068

此时子进程:PID=3071,PPID=1


wait系统调用


函数作用:父进程与子进程同步,父进程调用后。进入睡眠状态,直到子进程结束或者父进程在被其他进程终止,

形式:pid_twait(int *status)

pid_t waitpid(pid_t pid ,int *status,int option)

参数:statusè exit是设置的代码

pid è进程号

option: WNOHANG|WUNTRACED


WNOHANG:,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去.
WUNTRACED:子进程进入暂停则马上返回,但结束状态不予以理会.

返回值:如果成功等待子进程结束,则返回子进程PID。后者为-1

 

用来检查子进程返回状态的宏

WIFEXITED这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值.

WEXITSTATUS当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值

 

wait函数使用

#include <sys/types.h>
#include <sys/uio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#inc