linux system thread


原文链接: linux system thread

####1,进程创建方式

  • system 系统调用shell
  • fork 创建和父进程一样的进程拷贝
  • exec 创建一个新的进程,与父进程不同

####2,得到pid、和ppid

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
	printf("pid = %d\n",getpid());
	printf("pid = %d\n",getppid());
	
	return EXIT_SUCESS;
}

####3,获取当前用户信息
getlogin函数返回执行程序的登陆用户名
getpwnam函数可以返回/etc/passwd文件中与该登录名相关的完整一行
#include
struct passwd *getpwnam(const char *name);

/*例子*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>

int main()
{
	char * login = getlogin();
	struct passwd *ps = getpwnam(login);
	printf("user name=%s\n",ps->pw_name);
	printf("uid=%s\n",ps->pw_uid);
	printf("home dir=%s\n",ps->pw_dir);

	return EXIT_SUCESS;
}

####4,system 系统调用
system ("ls -l");

####5,fork 系统调用
#include
pid_t fork(void)
//fork 执行成功,想父进程返回子进程的pid,并向子进程返回
0,这意味着fork即使只调用一次,也会返回两次
//fork创建的新进程是和父进程(除pid和ppid)一样的副本
//父进程和子进程有点区别,子进程没有继承父进程的超时设置
(使用alarm调用)、父进程创建的文件锁,或者未决信号
//fork 失败返回 -1

####6,exec命令族

int main()
{
	char * args[] = {"/bin/ls","-l",NULL};
	execve("/bin/ls",args, NULL);
	
	printf("End\n");//不会执行,进程内容被execve覆盖


}

####7,wait()、waitpid()可以收集子进程的退出状态
#include
pid_t wait(int * status);
pid_t waitpid(pid_t pid,int * status,int options);
//status 保存子进程退出状态
//pid为等待进程的pid,他能接受下表列出4种值的一个
值 描述
-1 等待任何PGID等于PID 的绝对值子进程
1 等待任何子进程
0 等待任何PGID等于调用进程的子进程

0 等待PID等于pid的子进程

/*例子*/
#include <sys/wait.h>
#include <sys/types.h>
int main()
{
	pid_t pid = fork();
	int status;
	if(pid == -1)
	{
		printf("fork failed\n");
		return -1;
	}

	if(pid == 0)
	{
		printf("child process start\n");
		sleep(2);
		printf("child process start\n");
		return 100;
	
	}
	else
	{
		printf("parent process start\n");
		wait(&status);
		//等待子进程退出,并获得状态,不能搜集多个子进程
		//waitpid(pid,&status,0);
		//等待子进程退出,并获得状态,能搜集多个子进程
		printf("status %d\n",WEXITSTATUS(status));//用宏去解析这个状态
		printf("parent process start\n");
		return 0;
	
	
	}

}

//僵死进程
父进程没有调用wait,子进程就退出了,这个时候子进程就成了僵死进程

//孤儿进程
父进程在调用wait()或者waitpid()之前就已经退出的进程,叫做孤儿进程,此时init
成为此进程的父进程,由父进程收集孤儿进程的退出状态,避免其僵死

####8、结束进程
5种退出原因

  • main 中调用return
  • 调用exit函数,int exit(int status)返回状态值,用于非main函数中退出子进程
  • 调用_exit函数
  • 调用abort函数,void abort(void)导致程序异常终止,产生core文件
  • 被一个信号终止

`
kill函数
#include
#include
int kill(pid_t pid,int sig)
//exit,abort用来杀死自己
//kill函数用来杀死另一个进程
//参数pid指定一个要杀死的进程,sig指发送的信号

`