黑馬《linux系統程式設計》學習筆記(從16到20)
阿新 • • 發佈:2018-12-29
十六. exec函式族函式的使用
先是execl.c
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> int main(int argc, const char* argv[]) { printf("hello, world\n"); for(int i=0; i<3; ++i) { printf("parent i = %d\n", i); } pid_t pid = fork(); if(pid == -1) { perror("fork error"); exit(1); } // 子程序執行程式 if(pid == 0) { // execl("hello", "xxxx", NULL); //execl("/home/kevin/hello", "xxxx", NULL); //NULL這裡是哨兵,表示可變變數的輸入已經終止 //ls程式是用的子程序的地址空間 execl("/bin/ls","666","-lah",NULL); perror("execl"); exit(1); } for(int i=0; i<3; ++i) { printf(" i = %d\n", i); } return 0; }
執行結果是:
hello, world parent i = 0 parent i = 1 parent i = 2 i = 0 i = 1 i = 2 [[email protected]_0_15_centos 5Day]# total 144K drwxr-xr-x 4 root root 4.0K Dec 25 05:06 . dr-xr-x---. 15 root root 4.0K Dec 25 05:06 .. -rwxr-xr-x 1 root root 8.5K Dec 23 01:33 a.out -rw-r--r-- 1 root root 3.2K Dec 23 00:56 demo_exec.c -rw-r--r-- 1 root root 815 Dec 25 05:06 execl.c -rw-r--r-- 1 root root 539 Dec 23 00:56 execlp.c -rwxr-xr-x 1 root root 8.6K Dec 25 05:06 execl_res -rw-r--r-- 1 root root 921 Dec 23 01:33 fork.c -rw-r--r-- 1 root root 12K Dec 23 01:29 .fork.c.swp -rw-r--r-- 1 root root 255 Dec 24 22:11 heelo.c -rw-r--r-- 1 root root 8.4K Dec 23 00:56 hello drwxr-xr-x 2 root root 4.0K Dec 23 00:56 homework -rwxr-xr-x 1 root root 8.5K Dec 23 01:49 loop_f -rw-r--r-- 1 root root 1.1K Dec 25 02:46 loop_fork.c -rwxr-xr-x 1 root root 8.4K Dec 24 22:12 myhello -rw-r--r-- 1 root root 570 Dec 23 00:56 orphan.c drwxr-xr-x 2 root root 4.0K Dec 23 00:56 temp -rwxr-xr-x 1 root root 8.4K Dec 23 01:56 test_f -rw-r--r-- 1 root root 341 Dec 23 02:04 test_fork.c -rw-r--r-- 1 root root 1.1K Dec 23 00:56 wait.c -rw-r--r-- 1 root root 1.2K Dec 23 00:56 waitpid.c -rw-r--r-- 1 root root 627 Dec 23 00:56 zombie.c
顯然,在上述中,子程式只執行了execl中的。主程式執行了子程式的if之外的內容
不過一般說來,execl的變參那裡,並不是填666,而是與檔名相關的內容
接下來我們來處理execlp.c
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> int main(int argc, const char* argv[]) { printf("hello, world\n"); pid_t pid = fork(); if(pid == -1) { perror("fork error"); exit(1); } // 子程序執行程式 if(pid == 0) { execlp("ps", "pssdfsdf", "aux", NULL); perror("execlp"); exit(1); } for(int i=0; i<3; ++i) { printf(" i = %d\n", i); } return 0; }
十七. 孤兒程序和殭屍程序
接下來用程式驗證一下
首先是orphan.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
int main(int argc, const char* argv[])
{
pid_t pid = fork();
// 父程序
if(pid > 0)
{
printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
// sleep(1);
}
// 子程序
else if(pid == 0)
{
printf("child process, pid = %d, ppid = %d\n", getpid(), getppid());
sleep(2);
}
for(int i=0; i<5; ++i)
{
printf(" i = %d\n", i);
}
return 0;
}
然後是zombie.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
int main(int argc, const char* argv[])
{
pid_t pid = fork();
// 父程序
if(pid > 0)
{
printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
while(1)
{
printf(" i am live\n");
sleep(1);
}
}
// 子程序
else if(pid == 0)
{
printf("child process, pid = %d, ppid = %d\n", getpid(), getppid());
}
for(int i=0; i<5; ++i)
{
printf(" i = %d\n", i);
}
return 0;
}
十八. wait函式回收子程序資源
wait.c的程式
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, const char* argv[])
{
pid_t pid = fork();
// 父程序
if(pid > 0)
{
printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
// 回收資源
int status;
pid_t wpid = wait(&status);
printf("child died pid = %d\n", wpid);
// 通過返回值退出
if(WIFEXITED(status))
{
printf("child process exit value: %d\n", WEXITSTATUS(status));
}
// 子程序被訊號殺死
else if(WIFSIGNALED(status))
{
printf("child process died by signal: %d\n", WTERMSIG(status));
}
}
// 子程序
else if(pid == 0)
{
printf("child process, pid = %d, ppid = %d\n", getpid(), getppid());
sleep(200);
}
for(int i=0; i<5; ++i)
{
printf(" i = %d\n", i);
}
// return 10;
exit(10);
}
十九. waitpid函式簡介
二十. 學習目標