当前位置:首页 » 操作系统 » linux创建子进程

linux创建子进程

发布时间: 2022-03-07 03:13:26

❶ 创建一个子进程打开你的linux系统中的浏览器,子进程结束后输出子进程

#include
#include
#include
#define
BUFSIZE
10
int
main(void)
{
char
ch,dh,eh;
int
p[2];//文件描述符
pid_t
childpid;
if(pipe(p)
==
-1)//创建管道
{
perror("pipe
call");
return
-1;
}
if((childpid
=
fork())
==
-1)//创建子进程
{
perror("fork
call");
return
-1;
}
if(childpid!=0)//父进程
{
close(p[0]);//关闭读文件
do
{
ch
=
getchar();
write(p[1],&ch,1);//向管道写
}while(ch!='x');//遇到'x'则结束
}
else
if(childpid==0)//子进程
{
close(p[1]);//关闭写文件
while(1)
{
read(p[0],&dh,1);//从管道读
if(dh
==
'x')
{
printf("\n");
return
0;
}
else
if(dh>='a'&&dh<='z')
{
eh
=
(char)((int)dh
-
32);//转化成大写输出
printf("%c",eh);
}
else
{
printf("%c",dh);
}
}
}
}

❷ linux系统中创建子进程的程序,不知道该用getpid()还是getppid()

父进程返回的是是子进程号。他再getppid就成了他父亲的了。他这里是要返回他儿子的进程号。他儿子返回的是0,getppid得到他父亲的进程号。所以只有在父亲这里才可以得到子进程号。

❸ linux 父进程创建子进程的例子

父进程为什么要创建子进程呢?前面我们已经说过了Linux是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源.有时进程为了早一点完成任务就创建子进程来争夺资源. 一旦子进程被创建,父子进程一起从fork处继续执行,相互竞争系统的资源.有时候我们希望子进程继续执行,而父进程阻塞直到子进程完成任务.这个时候我们可以调用wait或者waitpid系统调用.
#i nclude
#i nclude

pid_t wait(int *stat_loc);
pid_t waitpid(pid_t pid,int *stat_loc,int options);

wait系统调用会使父进程阻塞直到一个子进程结束或者是父进程接受到了一个信号.如果没有父进程没有子进程或者他的子进程已经结束了wait回立即返回.成功时(因一个子进程结束)wait将返回子进程的ID,否则返回-1,并设置全局变量errno.stat_loc是子进程的退出状态.子进程调用exit,_exit 或者是return来设置这个值. 为了得到这个值Linux定义了几个宏来测试这个返回值.
WIFEXITED:判断子进程退出值是非0
WEXITSTATUS:判断子进程的退出值(当子进程退出时非0).
WIFSIGNALED:子进程由于有没有获得的信号而退出.
WTERMSIG:子进程没有获得的信号号(在WIFSIGNALED为真时才有意义).
waitpid等待指定的子进程直到子进程返回.如果pid为正值则等待指定的进程(pid).如果为0则等待任何一个组ID和调用者的组ID相同的进程.为-1时等同于wait调用.小于-1时等待任何一个组ID等于pid绝对值的进程. stat_loc和wait的意义一样. options可以决定父进程的状态.可以取两个值 WNOHANG:父进程立即返回当没有子进程存在时. WUNTACHED:当子进程结束时waitpid返回,但是子进程的退出状态不可得到.
父进程创建子进程后,子进程一般要执行不同的程序.为了调用系统程序,我们可以使用系统调用exec族调用.exec族调用有着5个函数.
#i nclude

int execl(const char *path,const char *arg,…);
int execlp(const char *file,const char *arg,…);
int execle(const char *path,const char *arg,…);
int execv(const char *path,char *const argv[]);
int execvp(const char *file,char *const argv[]):

exec族调用可以执行给定程序.关于exec族调用的详细解说可以参考系统手册(man execl). 下面我们来学习一个实例.注意编译的时候要加 -lm以便连接数学函数库.

#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude

void main(void)
{
pid_t child;
int status;

printf(”This will demostrate how to get child status\n”);
if((child=fork())==-1)
{
printf(”Fork Error :%s\n”,strerror(errno));
exit(1);
}
else if(child==0)
{
int i;
printf(”I am the child:%ld\n”,getpid());
for(i=0;i<1000000;i++) sin(i);
i=5;
printf(”I exit with %d\n”,i);
exit(i);
}
while(((child=wait(&status))==-1)&(errno==EINTR));
if(child==-1)
printf(”Wait Error:%s\n”,strerror(errno));
else if(!status)
printf(”Child %ld terminated normally return status is zero\n”,
child);
else if(WIFEXITED(status))
printf(”Child %ld terminated normally return status is %d\n”,
child,WEXITSTATUS(status));
else if(WIFSIGNALED(status))
printf(”Child %ld terminated e to signal %d znot caught\n”,
child,WTERMSIG(status));
}

strerror函数会返回一个指定的错误号的错误信息的字符串.

❹ 纯小白,请Linux怎么调用fork()创建两个子进程并运行

是的,需要在cpp里面调用fork,然后再执行exec。
下面是个例子:

pid_t pid = fork();
if (pid < 0) {
return;
}
else if (pid == 0) {
printf("child process!!!!\n");
char *argv[] = { (char *)"tst_app", (char *)"xx", NULL };
execv("/usr/bin/tst_app", argv);
}
请采纳,谢谢

❺ Linux中的用fork()如何由一个父进程创建同时多个子进程

int status,i;
for (i = 0; i < 10; i++)
{
status = fork();
if (status == 0 || status == -1) break;
}
if (status == -1)
{
//error
}
else if (status == 0)
{
//sub process
}
else
{
//parent process
}

❻ Linux中为什么要创建子进程

创建子进程才能多道程序并发执行,linux初始化的时候会创建swap进程、然后是init进程和一个init进程的兄弟进程,所有的进程(运行的程序)都是从父进程演化出去的,你可以看看proc里的东西,写个程序打印出各个进程的父进程~网上有源代码的,要的话我给你

咱要先搞明白进程究竟是什么,进程是资源分配的单位,是运行的程序。既然是运行的程序,一个进程自然只能代表一个程序,多道程序设计自然而然就有了多进程的概念。举个例子,多进程(线程)下载,我们可以给一个需要下载的资源分片,多个进程从不同的片分时下载,这样就提高了下载速度,因为对一个程序分配的更多的资源,你试试开迅雷的时候打开个网页,保证你觉得奇卡无比,因为网络带宽(资源)被迅雷的多个进程占用了。其实在本地的多进程程序并不多见,比如word算是个典型的多进程程序,有个进程接受你的键盘输入,有拼写检查进程,有显示进程等等。大多数都用到网络上了,比如服务器。一台服务器要在“同一时间”处理来自很多客户端的请求,这就必须使用多进程。

❼ linux 创建父进程和子进程并通信问题

看我下面的程序,还有问题可以 hi我

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
int pid, pfd[2], seq;

if (argc != 2)
{
printf("Usage:\t %s num\n", argv[0]);
return 1;
}

seq = atoi(argv[1]);
if (seq <= 0)
{
printf("Error: seq shall be larger than 0.\n");
return 1;
}

pid = fork();
if (pid == 0)
{
/* child 1 */
execlp("/bin/ls", "/bin/ls", "-R", ".", NULL);
}
else if (pid > 0)
{
wait(NULL);
printf("\n\nThis is parent process, child 1 finished.\n");
}

/* create pipe */
pipe(pfd);
pid = fork();

if (pid == 0)
{
/* child 2 */
int next = 1, i, fib = 0, tmp;
close(pfd[0]);
for (i = 0; i < seq; i++)
{
write(pfd[1], &fib, sizeof(fib));
tmp = fib;
fib = next;
next += tmp;
}
/* -1 indicates the end of fibonacci seq */
fib = -1;
write(pfd[1], &fib, sizeof(fib));
return 0;
}
else if (pid > 0)
{
/* parent */
int fib;

close(pfd[1]);
wait(NULL);

printf("In parent process, child 2 finished, time to print fibonacci sequence...\n");
while (read(pfd[0], &fib, sizeof(fib)) == sizeof(fib))
{
if (fib >= 0)
{
printf("%4d ", fib);
}
else
{
printf("\n");
break;
}
}
printf("\n All DONE!\n");
}

return 0;
}

❽ 请教linux下fork()创建子进程

pid = fork(); //创建进程命令点
if(pid < 0){...} //pid<0,表示fork出错,程序一般会退出,不会出现pid=0和pid>0的情况

else if(0 == pid){...} //从这个点开始,程序出现分支 pid=0表示fork出来的子进程分支
else{....} //否则是原进程,即父进程

printf("here!"); //如果在上面两个进程都没有exit()操作时,执行完{}中的命令,都会走到这里

关于fork出来的父子进程关系,请仔细阅读linux高级编程中进程一章节,内容很多,细细的阅读并练习体会吧

❾ linux下创建多进程,一个父进程可以有多个子进程吗,如果可以的话,父进程和多个子进程的关系是什么

2是谁创建的,他爹就是谁
fork会把子进程数据结构中的父进程号设置为当前进程号

❿ linux父进程创建两个子进程

#include"stdio.h"
#include"stdlib.h" //exit包含在stdlib.h头文件中
#include"unistd.h"
int main(void)
{
pid_t pid1,pid2;
pid1=fork();
switch(pid1)
{
case 0: //进程创建成功,返回值为0
printf("b"); //子进程1创建成功,输出b
break;
case -1:
printf("Process creation failed\n");//子进程创建失败,输出错误信息
break;
default:
printf("a");//此时执行父进程,输出a
sleep(1);
exit(0);
break;
}
pid2=fork();
switch(pid2)
{
case 0: //进程创建成功,返回值为0
printf("c"); //子进程2创建成功,输出c
break;
case -1:
printf("Process creation failed\n");//子进程创建失败,输出错误信息
exit(0);
break;
default:
printf("a");//此时执行父进程,输出a
//sleep(1);
exit(0);
break;
}
exit(0);
}

热点内容
sap脚本 发布:2024-09-24 07:16:00 浏览:614
演示源码 发布:2024-09-24 07:13:20 浏览:168
android加载地图api 发布:2024-09-24 07:04:55 浏览:521
discuz数据库安装 发布:2024-09-24 06:57:19 浏览:796
sql查询一列 发布:2024-09-24 06:42:14 浏览:654
我的世界服务器music指令 发布:2024-09-24 06:16:58 浏览:729
路由器怎么设置上网参数配置 发布:2024-09-24 06:16:17 浏览:557
老式电脑配置如何设置 发布:2024-09-24 06:07:08 浏览:461
将文件夹存到苹果手机 发布:2024-09-24 06:05:33 浏览:967
sqlserver最大连接数 发布:2024-09-24 05:57:00 浏览:164