2019.01.13
今天主要学习了父进程,子进程,孤儿进程,僵尸进程,杀死进程等进程的相关操作
1.main函数后面括号里有两个参数int argc, char *argv[] 在linux中表示的是./运行后接的参数
int main(int argc, char *argv[])
2.fork() 可以产生父子进程,父子进程同时进行但先后顺序不一定 父进程返回子进程的id
int main()
{
pid_t pid;
pid = fork();
if (-1 == pid) //出错
{
perror("fork");
exit(1);
}
else if (0 == pid)
{
printf("This is Child! %d\n", getpid());
printf("ppid %d\n", getppid());
printf("pid = %d\n", pid);
printf("***********\n");
while (1)
{
printf("child!\n");
sleep(1);
}
}
else
{
printf("This is Parent! %d\n", getpid());
printf("pid = %d\n", pid);
while (1)
{
printf("parent!\n");
sleep(2);
}
}
return 0;
}
3.vfork()也可以产生父子进程 但与fork()不同 vfork()的父子进程共享地址空间 而且子进程一定先运行
int main()
{
pid_t pid;
int a = 1;
pid = vfork(); //子进程和父进程共享地址空间
if (-1 == pid)
{
perror("vfork");
}
else if (0 == pid) //一定是子进程先运行
{
a++;
printf("This is Child a = %d %d!\n", a, getpid());
sleep(2);
exit(1); //子进程指定退出状态
}
else
{
a++;
printf("This is Parent a = %d %d!\n", a, getpid());
}
return 0;
}
3.exec用被执行的程序替换调用它的程序。
区别: fork创建一个新的进程,产生一个新的PID。
exec启动一个新程序,替换原有的进程,因此进程的PID不会改变
int main()
{
pid_t pid;
pid = vfork();
if (-1 == pid)
{
perror("vfork");
}
else if (0 == pid)
{
char *arg[] = {"./test", "hello", "1234", "world", NULL};
printf("This is Child pid = %d\n", getpid());
//execl("/home/167/linux/process/test", "./test", "hello", "1234", "world", NULL); //启动新进程
//execl("/bin/ls", "ls", "-l", "-a", NULL);
execv("/home/167/linux/process/test", arg);
printf("helloworld!\n");
}
else
{
printf("This is Parent!\n");
}
return 0;
}
4.采用父子进程对文件进行操作可以有两种方式 1.一个是子进程打开文件写文件 父进程打开文件读文件2.另一个是先开文件然后子进程写文件父进程读文件
一。第一种
void WriteFile()
{
int fd = open("hello.txt", O_WRONLY | O_CREAT, 00700);
if (-1 == fd)
{
perror("open");
}
char buf[32] = "helloworld";
int ret = write(fd, buf, strlen(buf));
if (-1 == ret)
{
perror("write");
}
close(fd);
}
void ReadFile()
{
int fd = open("hello.txt", O_RDONLY);
if (-1 == fd)
{
perror("open");
}
char buf[32] = {0};
int ret = read(fd, buf, sizeof(buf));
if (-1 == ret)
{
perror("read");
}
printf("read from file %s\n", buf);
close(fd);
}
int main()
{
pid_t pid;
pid = fork();
if (-1 == pid)
{
perror("fork");
exit(1);
}
else if (0 == pid) //子进程写文件
{
WriteFile();
}
else //父进程读文件
{
sleep(1);
ReadFile();
}
return 0;
}
二。第二种
void WriteFile(int fd)
{
char buf[32] = "helloworld";
int ret = write(fd, buf, strlen(buf));
if (-1 == ret)
{
perror("write");
}
}
void ReadFile(int fd)
{
char buf[32] = {0};
lseek(fd, 0, SEEK_SET);
int ret = read(fd, buf, sizeof(buf));
if (-1 == ret)
{
perror("read");
}
printf("read from file %s\n", buf);
close(fd);
}
int main()
{
pid_t pid;
int fd = open("hello.txt", O_CREAT | O_RDWR, 00700);
if (-1 == fd)
{
perror("open");
exit(1);
}
pid = fork();
if (-1 == pid)
{
perror("fork");
exit(1);
}
else if (0 == pid) //子进程写文件
{
WriteFile(fd);
}
else //父进程读文件
{
sleep(1);
ReadFile(fd);
}
return 0;
}
5.孤儿进程指父进程提前结束 僵尸进程指父进程没有回收子进程资源
wait(&status); //1、等待子进程结束 2、回收子进程资源
waitpid(pid, &status, 0); //等待指定的进程结束