當前位置:首頁 » 操作系統 » linux進程創建

linux進程創建

發布時間: 2023-09-22 23:28:54

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語言創建守護進程並監控系統運行期間的所有進程

可以分三步來做:


  1. 做兩個簡單的守護進程,並能正常運行

  2. 監控進程是否在運行

  3. 啟動進程


綜合起來就可以了,代碼如下:
被監控進程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 -- 查看日誌

熱點內容
少兒編程排行 發布:2025-01-24 04:40:46 瀏覽:697
搭建伺服器怎麼使用 發布:2025-01-24 04:19:34 瀏覽:443
平行進口霸道哪些配置有用 發布:2025-01-24 04:19:32 瀏覽:873
ngram演算法 發布:2025-01-24 04:03:16 瀏覽:658
迷宮游戲c語言 發布:2025-01-24 03:59:09 瀏覽:357
榮耀30pro存儲類型 發布:2025-01-24 03:54:02 瀏覽:556
客戶端文件上傳 發布:2025-01-24 03:48:44 瀏覽:257
推特更改密碼的用戶名是什麼 發布:2025-01-24 03:45:55 瀏覽:596
cc編譯選項 發布:2025-01-24 03:45:18 瀏覽:511
銀行密碼怎麼被鎖 發布:2025-01-24 03:37:02 瀏覽:431