在linux系统下实现对system() 函数对fork() ,exec(),waitpid()函数的调用。求大神解答

作者&投稿:休尚 (若有异议请与网页底部的电邮联系)
linux中system和exec函数的区别~

system是用shell来调用程序=fork+exec+waitpid,而exec是直接让你的程序代替用来的程序运行。
system 是在单独的进程中执行命令,完了还会回到你的程序中。而exec函数是直接在你的进程中执行新的程序,新的程序会把你的程序覆盖,除非调用出错,否则你再也回不到exec后面的代码,就是说你的程序就变成了exec调用的那个程序了。
看一下,下面的例子.
例子1
---------------------------------
system("your_program");
printf("You can see me! ");
---------------------------------
例子2
---------------------------------
exec("your_program");
printf("You can't see me! ");
---------------------------------
在例子1中,在你的程序执行完毕以后,会执行printf语句。
在例子2中,由于exec将程序your_program代替了本身,因此程序不再会执行printf语句。
在Linux下,exec通常会和fork语句一起用。
看下面的这个例子
--------------------------------------------
pid_t pid = fork();
if (pid < 0) {
printf(“fork error!”);
exit(-1);
} else if (pid == 0) {
//这里是子进程
printf("I'm son! ");
//执行其它的程序
exec("your_program");
} else {
//这里是父进程
printf("i'm father!");
wait();//等待子进程结束后返回
exit(0);
}

20分?

20英镑还差不多
20分?

20英镑还差不多

不知道你这实现这些函数的调用是什么意思,是要重写这些接口吗?还是举个例子说明?
我解释一下吧:
(1)system()其实就是对fork()和exec()函数族等的封装。
(2)fork()是用来产生子进程的,是现在我知道的唯一一个返回两个值的函数(有过有另外的,麻烦网友指出),返回-1表示执行失败;否则返回大于0的值时,表示是子进程的进程号,返回0时,表示父进程创建子进程成功。
(3)exec()不是一个函数,是函数族,有execl(),execv(),execle(),execve(),execlp(),execvp(),它们常用于子进程中“脱胎换骨”,就是父进程创建子进程后,子进程几乎是父进程的拷贝(只有很少的东西不一样,如进程号(PID)等),然后子进程调用exec()函数族执行其他的程序,即将原来进程的东西全部清除掉,称为一个崭新的进程,所以叫“脱胎换骨”。
(4)waitpid()是用在父进程中等待进程退出的,如果父进程不调用这个接口,那么它有可能先于子进程退出,那么子进程就会称为孤儿进程,继而被init进程(PID为1的进程,Linux启动后第一个启动的进程)收养。或者父进程并未退出,也未调用这个接口,但是子进程已经执行完成,那么子进程就会成为一个僵尸进程。
具体例子在网上找找吧,都不是很难。


在linux系统下利用PC机实现路由转发的具体步骤
网络拓扑如下所示,我们在这里用到了三台机子做实验,分别是①、④、⑦号机,使用①号机ping⑦号机,④号机作为路由转发。 2、错误的路由配置 首先我们使用如下的配置方法,配置这三台机子的路由表: 1)在①号机种配置如下,让目的网段是10.0.4.0\/24的从eth1端口出去 route add -net 10.0.4.0\/24 dev eth1 在...

图文详解:Linux系统下安装TensorRT
Linux系统下安装TensorRT的详细图文指南,确保安装过程一帆风顺。首先,版本配置至关重要。确保已正确安装CUDA和cuDNN,这为后续TensorRT的安装奠定了坚实基础。检查CUDA版本和cuDNN版本,以确认兼容性。在确保CUDA和cuDNN安装无误后,紧接着进行Python和PyTorch的安装。Python环境需稳定,PyTorch版本应与TensorRT...

在linux系统下实现对system() 函数对fork() ,exec(),waitpid()函数的调 ...
即将原来进程的东西全部清除掉,称为一个崭新的进程,所以叫“脱胎换骨”。(4)waitpid()是用在父进程中等待进程退出的,如果父进程不调用这个接口,那么它有可能先于子进程退出,那么子进程就会称为孤儿进程,继而被init进程(PID为1的进程,Linux启动后第一个启动的进程)收养。或者父进程并未退出,...

在Linux下实现文件自动下载linux控制下载
Linux是一款日趋完善的操作系统,已经广泛使用在服务器上。在Linux下实现文件自动下载是一件非常有用的事情,可以节省时间,提高工作效率。要在Linux下实现文件自动下载,首先要安装wget软件。Wget是一个开源的命令行工具,可以用来通过网络从网站上下载文件。安装完成后,可以使用wget命令来实现自动下载文件。...

自己在linux系统下实现memcpy的功能,我的理解是memcpy可以处理任意...
include<stddef.h> include<assert.h> void *mymemcpy(void *dest, const void *src, size_t n){ assert(dest!=NULL&&src!=NULL);char* tmp=(char*)dest;const char*s=(const char*)src;for(size_t i=0;i<n;i++){ tmp[i]=s[i];} return dest;} DevC++测试通过 ...

linux系统下1000mb\/s实际支撑多大带宽
最多只有40MB\/S首先 你这1000Mbps的网络带宽实际下载速度换算成MB\/S的话是1000Mbps\/8=125MB\/S,但是你这硬盘的最大写入速度就只有40MB\/S,带宽受限于硬盘的写入速度,只能最高到达40MB\/S,不过现在的硬盘一般写入速度就算是机械硬盘一般要比40MB\/S大很多 ...

Linux下一键重启系统的实现linux命令重启系统
Linux操作系统是当今大多数服务器的首选,它的稳定性、安全性和高可用性等特点为企业级应用提供了可靠的基础。但在使用过程中,经常出现不少系统问题,对于这些问题的处理,重启服务器是很有效果的,本文就来介绍一下如何在linux系统下一键重启系统。第一步:登录Turbo Station终端。在linux系统中,我们可以...

在linux操作系统下如何实现每创建一个新用户系统就自动在根目录下创建...
将\/etc\/skel目录的内容复制到用户的HOME目录 -m 创建用户的HOME目录 -M 不创建用户的HOME目录(当默认设置里指定创建时,才用到)-n 创建一个同用户登录名同名的新组 -r 创建系统账户 -p passwd 为用户账户指定默认密码 -s shell 指定默认登录shell -u uid 为账户指定一个唯一的UID ...

Linux系统下Shell多线程编程的实例
和linux中的命令 mknod tmpfile p 效?果相同。区别是mkfifo为POSIX标准,因此推荐使用它。该命令创建了一个先入先出的管道文件,并为其分配文件标志符6。管道文件是进程之间通信的一种方式,注意这一句很重要 exec 6$tmp_fifofile      # 将fd6指向fifo类型 如果没...

Linux下临界区的原理和应用linux下临界区
Linux下实现临界区有三种方法:信号量法、禁止调度程序以及页锁。信号量法是一种数字手段,Linux系统实现了semaphore机制,通过对信号量的操作(包括wait、signal等)实现临界区的控制;禁止调度程序方法是使用preempt_disable()\/preempt_enable()函数禁止抢先式抢占,但在实际使用时是否存在性能问题尚待考究;...

湛河区15756626417: 在Linux系统下编写shell程序,十万火急,求解! -
伊骨舒心: #!/bin/bash echo -e "数\t平方\t立方" for i in `seq 1 $1`;do echo -e "$i\t$(($i*$i))\t$(($i*$i*$i))" done 使用方法 ./test.sh 20

湛河区15756626417: 在linux系统下实现对system() 函数对fork() ,exec(),waitpid()函数的调用.求大神解答
伊骨舒心: 不知道你这实现这些函数的调用是什么意思,是要重写这些接口吗?还是举个例子说明?我解释一下吧:(1)system()其实就是对fork()和exec()函数族等的封装.(2)fork()是用来产生子进程的,是现在我知道的唯一一个返回两个值的函...

湛河区15756626417: 在linux系统下,编写一个shell脚本 实现对文件的监控 -
伊骨舒心: 如果文件比较小,你可以备份原文件用diff来对比判断.因为不知道你具体是想通过什么对比,不好说.你可以通过tripwire这个软件来检测, 具体安装方法自己百度,不细说了.如果自己写你必须要找到一些判断内容,比如时间,容量,如果文件包含时间戳你就可以 判断时间戳来截取文件内容.自己写的话就需要具体情况具体分析.

湛河区15756626417: linux系统调用和库函数调用的区别 -
伊骨舒心: Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思.面向的是硬件.而库函数调用则面向的是应用开发的,相当于应...

湛河区15756626417: 如何在Linux上实现文件系统的自动检查和修复 -
伊骨舒心: 我在本教程中将介绍如何借助fsck工具,实现文件系统的自动检查. 系统一启动,就触发文件系统自动检查机制 如果你希望系统一启动,就自动触发fsck,那么有一些方法可以设置在启动过程中实现无人值守的fschk,这些方法具体取决于特定的...

湛河区15756626417: ls - prepost怎么切换成经典用户界面 -
伊骨舒心: 本文为您讲解假如在Linux系统下实现图形界面与Linux命令行模式切换.一、Linux系统安装的流程中默认语言是英文,而不是中文简体(安装流程中有两次制定语言选项,起决定作用的是第二次)二、Linux命令行模式切换:切换控制台,由...

湛河区15756626417: 如何在linux内核中添加系统调用 -
伊骨舒心: 一、Linux0.11下添加系统调用: 我在bochs2.2.1中对linux0.11内核添加了一个新的系统调用,步骤如下: 1./usr/src/linux/include/unistd.h中添加:#define __NR_mytest 87 然后在下面声明函数原型:int mytest(); 2./usr/src/linux/include/linux/sys.h中...

湛河区15756626417: linux系统下安装一个软件 -
伊骨舒心: 一、解析Linux应用软件安装包 通常Linux应用软件的安装包有三种:1) tar包,如software-1.2.3-1.tar.gz.它是使用UNIX系统的打包工具tar打包的.2) rpm包,如software-1.2.3-1.i386.rpm.它是Redhat Linux提供的一种包封装格式.3) dpkg包...

湛河区15756626417: linux系统中,写一个shell对指定目录下的文件大于特定值时自动进行备份.加急! -
伊骨舒心: 用perl实现较容易 配置文件: /xxx/backup.conf A 200 B 100 C 50 脚本: /xxx/backup.pl #!/usr/bin/perl use strict; use File::Basename;# 配置文件名 my $config_file = "/xxx/backup.conf";# 源目录 my $src_dir = "/tmp";#备份目录 my $...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网