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,获取当前用户信息 ####4,system 系统调用 ####5,fork 系统调用 ####6,exec命令族 ####7,wait()、waitpid()可以收集子进程的退出状态 0 等待PID等于pid的子进程 //僵死进程 //孤儿进程 ####8、结束进程 `
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;
}
system ("ls -l");
#include
pid_t fork(void)
//fork 执行成功,想父进程返回子进程的pid,并向子进程返回
0,这意味着fork即使只调用一次,也会返回两次
//fork创建的新进程是和父进程(除pid和ppid)一样的副本
//父进程和子进程有点区别,子进程没有继承父进程的超时设置
(使用alarm调用)、父进程创建的文件锁,或者未决信号
//fork 失败返回 -1int main()
{
char * args[] = {"/bin/ls","-l",NULL};
execve("/bin/ls",args, NULL);
printf("End\n");//不会执行,进程内容被execve覆盖
}
#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等于调用进程的子进程/*例子*/
#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
成为此进程的父进程,由父进程收集孤儿进程的退出状态,避免其僵死
5种退出原因
kill函数
#include
#include
int kill(pid_t pid,int sig)
//exit,abort用来杀死自己
//kill函数用来杀死另一个进程
//参数pid指定一个要杀死的进程,sig指发送的信号