linux進程創建
① linux 創建進程為什麼fork
創建子進程才能多道程序並發執行,linux初始化的時候會創建swap進程、然後是init進程和一個init進程的兄弟進程,所有的進程(運行的程序)都是從父進程演化出去的,你可以看看proc里的東西,寫個程序列印出各個進程的父進程~網上有源代碼的,要的話我給你咱要先搞明白進程究竟是什麼,進程是資源分配的單位,是運行的程序。既然是運行的程序,一個進程自然只能代表一個程序,多道程序設計自然而然就有了多進程的概念。舉個例子,多進程(線程)下載,我們可以給一個需要下載的資源分片,多個進程從不同的片分時下載,這樣就提高了下載速度,因為對一個程序分配的更多的資源,你試試開迅雷的時候打開個網頁,保證你覺得奇卡無比,因為網路帶寬(資源)被迅雷的多個進程佔用了。其實在本地的多進程程序並不多見,比如word算是個典型的多進程程序,有個進程接受你的鍵盤輸入,有拼寫檢查進程,有顯示進程等等。大多數都用到網路上了,比如伺服器。一台伺服器要在「同一時間」處理來自很多客戶端的請求,這就必須使用多進程。
② 在Linux運維中如何用cat命令創建一個前台進程
具體操作如下:
打開終端,進入你想卜雀姿要創建進程的目錄。
輸入cat命令,歲大並指定你想要創建的文件名。例如:
- cat > myfile
在新的一行中輸入你想要保存在文件中的內容。例如:
- This is the content of my file.
按下CTRL + D鍵退出輸入模式,這樣cat命令就會停止運行,並創建一個新的文件。
使用ls命令檢查型絕新文件是否已經被創建
③ linux關於子進程的創建,先讓子進程輸出當前所在位置,再讓父進程在當前目錄下新建一個名為hise的文件夾
#include<stdio.h>
#include<stdlib.h>
#include<備殲unistd.h>
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/wait.h>
intmain(intargc,char*argv[]){
intfd[2];
pid_tpid;
if(pipe(fd)<0){
perror("pipe");
exit(1);
}
if((pid=fork())<0){
perror("fork");
exit(2);
}elseif(pid==0){
close(fd[0]);
charpath1[1024]={0};
getcwd(path1,sizeof(path1));
printf("childpath1====%s ",path1);
write(fd[1],path1,strlen(path1));
printf("childPID=%d,parentPID=%d ",getpid(),getppid());
sleep(3);
}else{
charpath2[1024]={0};
charbuf[1024];
close(fd[1]);
intflg=fcntl(fd[0],F_GETFL);
flg|=O_NONBLOCK;
fcntl(fd[0],F_SETFL);
read(fd[0],buf,sizeof(buf));
printf("parentbuf=%s ",buf);
umask(0000);
if(mkdir("hise",0755)){
perror("mkdir");
exit(1);
}
chdir("hise");
intfd_file=open("./01.c",O_RDONLY);
int兆岩fd_file2=open("./cp01.c"仿猜沖,O_WRONLY|O_CREAT,0644);
intbuf2[1024];
memset(buf2,0,1024);
while(read(fd_file,buf2,sizeof(buf2)-1)>0){
write(fd_file2,buf2,strlen(buf2));
}
wait(NULL);
sleep(3);
}
return0;
}
④ 如何在Linux下用c語言創建守護進程並監控系統運行期間的所有進程
可以分三步來做:
- 做兩個簡單的守護進程,並能正常運行
- 監控進程是否在運行
- 啟動進程
綜合起來就可以了,代碼如下:
被監控進程thisisatest.c(來自):
#include<unistd.h>
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/param.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<time.h>
void init_daemon()
{
int pid;
int i;
pid=fork();
if(pid<0)
exit(1); //創建錯誤,退出
else if(pid>0) //父進程退出
exit(0);
setsid(); //使子進程成為組長
pid=fork();
if(pid>0)
exit(0); //再次退出,使進程不是組長,這樣進程就不會打開控制終端
else if(pid<0)
exit(1);
//關閉進程打開的文件句柄
for(i=0;i<NOFILE;i++)
close(i);
chdir("/root/test"); //改變目錄
umask(0);//重設文件創建的掩碼
return;
}
void main()
{
FILE *fp;
time_t t;
init_daemon();
while(1)
{
sleep(60); //等待一分鍾再寫入
fp=fopen("testfork2.log","a");
if(fp>=0)
{
time(&t);
fprintf(fp,"current time is:%s ",asctime(localtime(&t))); //轉換為本地時間輸出
fclose(fp);
}
}
return;
}
監控進程monitor.c:
#include<unistd.h>
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/param.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<time.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<limits.h>
#define BUFSZ 150
void init_daemon()
{
int pid;
int i;
pid=fork();
if(pid<0)
exit(1); //創建錯誤,退出
else if(pid>0) //父進程退出
exit(0);
setsid(); //使子進程成為組長
pid=fork();
if(pid>0)
exit(0); //再次退出,使進程不是組長,這樣進程就不會打開控制終端
else if(pid<0)
exit(1);
//關閉進程打開的文件句柄
for(i=0;i<NOFILE;i++)
close(i);
chdir("/root/test"); //改變目錄
umask(0);//重設文件創建的掩碼
return;
}
void err_quit(char *msg)
{
perror(msg);
exit(EXIT_FAILURE);
}
// 判斷程序是否在運行
int does_service_work()
{
FILE* fp;
int count;
char buf[BUFSZ];
char command[150];
sprintf(command, "ps -ef | grep thisisatest | grep -v grep | wc -l" );
if((fp = popen(command,"r")) == NULL)
err_quit("popen");
if( (fgets(buf,BUFSZ,fp))!= NULL )
{
count = atoi(buf);
}
pclose(fp);
return count;
// exit(EXIT_SUCCESS);
}
void main()
{
FILE *fp;
time_t t;
int count;
init_daemon();
while(1)
{
sleep(10); //等待一分鍾再寫入
fp=fopen("testfork3.log","a");
if(fp>=0)
{
count = does_service_work();
time(&t);
if(count>0)
fprintf(fp,"current time is:%s and the process exists, the count is %d ",asctime(localtime(&t)), count); //轉換為本地時間輸出
else
{
fprintf(fp,"current time is:%s and the process does not exist, restart it! ",asctime(localtime(&t))); //轉換為本地時間輸出
system("/home/user/daemon/thisisatest"); //啟動服務
}
fclose(fp);
}
}
return;
}
具體CMD命令:
cc thisisatest.c -o thisisatest
./thisisatest
cc monitor.c -o monitor
./monitor
tail -f testfork3.log -- 查看日誌