当前位置:首页 » 操作系统 » 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 -- 查看日志

热点内容
我的世界服务器房间号2020电脑版 发布:2025-01-24 01:28:05 浏览:398
微信提示存储空间不足 发布:2025-01-24 01:19:53 浏览:963
安卓电脑管家如何清除缓存 发布:2025-01-24 00:55:42 浏览:148
怎么上传歌曲到qq音乐 发布:2025-01-24 00:45:30 浏览:65
养猫用什么配置 发布:2025-01-24 00:37:58 浏览:812
pythongps 发布:2025-01-24 00:37:51 浏览:813
办公编程鼠标 发布:2025-01-24 00:37:07 浏览:386
wpa加密类型 发布:2025-01-24 00:35:58 浏览:960
如何用批处理实现ftp映射盘符 发布:2025-01-24 00:25:45 浏览:954
win7sql版本 发布:2025-01-24 00:22:16 浏览:499