进程管理之二(wait、exec、system的使用)

第一关

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


/************************
 * 返回值: 调用成功且子进程正常退出返回退出代码,否则返回-1
*************************/
int waitProcess()
{
	int status = -1;
	/********** BEGIN **********/
	 pid_t pid;
    pid = fork();
    if(pid == -1)
    {
        //创建进程失败
        return -1;
    }
    else if(pid == 0)
    {
        //子进程
        sleep(2);
        printf("This is child process\n");
        exit(1);
    }
    else
    {
        //父进程
        int status;
        if(waitpid(-1, &status, 0) != -1)
        {
            if(WIFEXITED(status))
                return WEXITSTATUS(status);
        }

        
        exit(0);
    }
	
	/********** END **********/
	
	return status;
}

第二关

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

/************************
 * 提示: 在子进程中如果执行exec函数失败要使用exit函数正确退出子进程
*************************/
int execlProcess()
{
	pid_t pid = vfork();
	if(pid == -1)
	{
		printf("创建子进程失败(%s)\n", strerror(errno));
		return -1;
	}
	else if(pid == 0)
	{
		//子进程
		/********** BEGIN **********/
		if(execlp("touch", "touch", "testFile",  NULL) < 0)
        {
            //执行execlp函数失败
            exit(-1);
        }
		
		/********** END **********/
	}
	else
	{
		//父进程
		/********** BEGIN **********/
		 printf("Parent Process");
		
		/********** END **********/
	}
}

第三关

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

/************************
 * 返回值: 调用成功返回命令的状态码,失败返回-1
*************************/
int createProcess()
{
	int ret = -1;
	/********** BEGIN **********/
	 ret=system("mkdir testDir");
     if(ret == -1)
    {
        return -1;
    }
	
	/********** END **********/
	
	return ret;
}

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
第一部分 简介   第1章 简介 2   1.1 概述 2   1.2 进程、线程与信息共享 3   1.3 IPC对象的持续性 4   1.4 名字空间 5   1.5 fork、exec和exit对IPC对象的影响 7   1.6 出错处理:包裹函数 8   1.7 Unix标准 9   1.8 书中IPC例子索引表 11   1.9 小结 13   习题 13   第2章 Posix IPC 14   2.1 概述 14   2.2 IPC名字 14   2.3 创建与打开IPC通道 16   2.4 IPC权限 18   2.5 小结 19   习题 19   第3章 System V IPC 20   .3.1 概述 20   3.2 key_t键和ftok函数 20   3.3 ipc_perm结构 22   3.4 创建与打开IPC通道 22   3.5 IPC权限 24   3.6 标识符重用 25   3.7 ipcs和ipcrm程序 27   3.8 内核限制 27   3.9 小结 28   习题 29   第二部分 消息传递   第4章 管道和FIFO 32   4.1 概述 32   4.2 一个简单的客户-服务器例子 32   4.3 管道 32   4.4 全双工管道 37   4.5 popen和pclose函数 39   4.6 FIFO 40   4.7 管道和FIFO的额外属性 44   4.8 单个服务器,多个客户 46   4.9 对比迭代服务器与并发服务器 50   4.10 字节流与消息 51   4.11 管道和FIFO限制 55   4.12 小结 56   习题 57   第5章 Posix消息队列 58   5.1 概述 58   5.2 mq_open、mq_close和mq_unlink函数 59   5.3 mq_getattr和mq_setattr函数 61   5.4 mq_send和mq_receive函数 64   5.5 消息队列限制 67   5.6 mq_notify函数 68   5.7 Posix实时信号 78   5.8 使用内存映射I/O实现Posix消息队列 85   5.9 小结 101   习题 101   第6章 System V消息队列 103   6.1 概述 103   6.2 msgget函数 104   6.3 msgsnd函数 104   6.4 msgrcv函数 105   6.5 msgctl函数 106   6.6 简单的程序 107   6.7 客户-服务器例子 112   6.8 复用消息 113   6.9 消息队列上使用select和poll 121   6.10 消息队列限制 122   6.11 小结 124   习题 124   第三部分 同步   第7章 互斥锁和条件变量 126   7.1 概述 126   7.2 互斥锁:上锁与解锁 126   7.3 生产者-消费者问题 127   7.4 对比上锁与等待 131   7.5 条件变量:等待与信号发送 132   7.6 条件变量:定时等待和广播 136   7.7 互斥锁和条件变量的属性 136   7.8 小结 139   习题 139   第8章 读写锁 140   8.1 概述 140   8.2 获取与释放读写锁 140   8.3 读写锁属性 141   8.4 使用互斥锁和条件变量实现读写锁 142   8.5 线程取消 148   8.6 小结 153   习题 153   第9章 记录上锁 154   9.1 概述 154   9.2 对比记录上锁与文件上锁 157   9.3 Posix fcntl记录上锁 158   9.4 劝告性上锁 162   9.5 强制性上锁 164   9.6 读出者和写入者的优先级 166   9.7 启动一个守护进程的唯一副本 170   9.8 文件作锁用 171   9.9 NFS上锁 173   9.10 小结 173   习题 174   第10章 Posix信号量 175   10.1 概述 175   10.2 sem_open、sem_close和sem_   unlink函数 179   10.3 sem_wait和sem_trywait函数 180   10.4 sem_post和sem_getvalue函数 180   10.5 简单的程序 181   10.6 生产者-消费者问题 186   10.7 文件上锁 190   10.8 sem_init和sem_destroy函数 191   10.9 多个生产者,单个消费者 193   10.10 多个生产者,多个消费者 19
两卷本的《UNIX网络编程》是已故著名技术作家W. Richard Stevens的传世之作。卷2着重讨论如何让应用程序与在其他机器上的应用程序进行对话。良好的进程间通信(IPC)机制是提高UNIX程序性能的关键。本书全面深入地讲解了各种进程间通信形式,包括消息传递、同步、共享内存及远程调用(RPC)。书中包含了大量经过优化的源代码,帮助读者加深理解。这些源代码可以从图灵网站本书网页免费注册下载。 本书是网络研究和开发人员公认的权威参考书,深入理解本书内容,方能设计出良好的UNIX软件 目录回到顶部↑ 第一部分 简介 第1章 简介 2 1.1 概述 2 1.2 进程、线程与信息共享 3 1.3 IPC对象的持续性 4 1.4 名字空间 5 1.5 fork、exec和exit对IPC对象的影响 7 1.6 出错处理:包裹函数 8 1.7 Unix标准 9 1.8 书中IPC例子索引表 11 1.9 小结 13 习题 13 第2章 Posix IPC 14 2.1 概述 14 2.2 IPC名字 14 2.3 创建与打开IPC通道 16 2.4 IPC权限 18 2.5 小结 19 习题 19 第3章 System V IPC 20 .3.1 概述 20 3.2 key_t键和ftok函数 20 3.3 ipc_perm结构 22 3.4 创建与打开IPC通道 22 3.5 IPC权限 24 3.6 标识符重用 25 3.7 ipcs和ipcrm程序 27 3.8 内核限制 27 3.9 小结 28 习题 29 第二部分 消息传递 第4章 管道和FIFO 32 4.1 概述 32 4.2 一个简单的客户-服务器例子 32 4.3 管道 32 4.4 全双工管道 37 4.5 popen和pclose函数 39 4.6 FIFO 40 4.7 管道和FIFO的额外属性 44 4.8 单个服务器,多个客户 46 4.9 对比迭代服务器与并发服务器 50 4.10 字节流与消息 51 4.11 管道和FIFO限制 55 4.12 小结 56 习题 57 第5章 Posix消息队列 58 5.1 概述 58 5.2 mq_open、mq_close和mq_unlink函数 59 5.3 mq_getattr和mq_setattr函数 61 5.4 mq_send和mq_receive函数 64 5.5 消息队列限制 67 5.6 mq_notify函数 68 5.7 Posix实时信号 78 5.8 使用内存映射I/O实现Posix消息队列 85 5.9 小结 101 习题 101 第6章 System V消息队列 103 6.1 概述 103 6.2 msgget函数 104 6.3 msgsnd函数 104 6.4 msgrcv函数 105 6.5 msgctl函数 106 6.6 简单的程序 107 6.7 客户-服务器例子 112 6.8 复用消息 113 6.9 消息队列上使用select和poll 121 6.10 消息队列限制 122 6.11 小结 124 习题 124 第三部分 同步 第7章 互斥锁和条件变量 126 7.1 概述 126 7.2 互斥锁:上锁与解锁 126 7.3 生产者-消费者问题 127 7.4 对比上锁与等待 131 7.5 条件变量:等待与信号发送 132 7.6 条件变量:定时等待和广播 136 7.7 互斥锁和条件变量的属性 136 7.8 小结 139 习题 139 第8章 读写锁 140 8.1 概述 140 8.2 获取与释放读写锁 140 8.3 读写锁属性 141 8.4 使用互斥锁和条件变量实现读写锁 142 8.5 线程取消 148 8.6 小结 153 习题 153 第9章 记录上锁 154 9.1 概述 154 9.2 对比记录上锁与文件上锁 157 9.3 Posix fcntl记录上锁 158 9.4 劝告性上锁 162 9.5 强制性上锁 164 9.6 读出者和写入者的优先级 166 9.7 启动一个守护进程的唯一副本 170 9.8 文件作锁用 171 9.9 NFS上锁 173 9.10 小结 173 习题 174 第10章 Posix信号量 175 10.1 概述 175 10.2 sem_open、sem_close和sem_ unlink函数 179 10.3 sem_wait和sem_trywait函数 180 10.4 sem_post和sem_getvalue函数 180 10.5 简单的程序 181 10.6 生产者-消费者问题 186 10.7 文件上锁 190 10.8 sem_init和sem_destroy函数 191 10.9 多个生产者,单个消费者 193 10.10 多个生产者,多个消费者 196 10.11 多个缓冲区 199 10.12 进程间共享信号量 205 10.13 信号量限制 206 10.14 使用FIFO实现信号量 206 10.15 使用内存映射I/O实现信号量 210 10.16 使用System V信号量实现Posix信号量 218 10.17 小结 224 习题 225 第11章 System V 信号量 226 11.1 概述 226 11.2 semget函数 227 11.3 semop函数 229 11.4 semctl函数 231 11.5 简单的程序 232 11.6 文件上锁 237 11.7 信号量限制 238 11.8 小结 242 习题 242 第四部分 共享内存区 第12章 共享内存区介绍 244 12.1 概述 244 12.2 mmap、munmap和msync函数 247 12.3 在内存映射文件中给计数器持续加1 250 12.4 4.4BSD匿名内存映射 254 12.5 SVR4 /dev/zero内存映射 255 12.6 访问内存映射的对象 255 12.7 小结 259 习题 260 第13章 Posix共享内存区 261 13.1 概述 261 13.2 shm_open和shm_unlink函数 261 13.3 ftruncate和fstat函数 262 13.4 简单的程序 263 13.5 给一个共享的计数器持续加1 267 13.6 向一个服务器发送消息 270 13.7 小结 275 习题 275 第14章 System V共享内存区 276 14.1 概述 276 14.2 shmget函数 276 14.3 shmat函数 277 14.4 shmdt函数 277 14.5 shmctl函数 277 14.6 简单的程序 278 14.7 共享内存区限制 281 14.8 小结 282 习题 283 第五部分 远程过程调用 第15章 门 286 15.1 概述 286 15.2 door_call函数 291 15.3 door_create函数 292 15.4 door_return函数 293 15.5 door_cred函数 294 15.6 door_info函数 294 15.7 例子 295 15.8 描述符传递 306 15.9 door_sever_create函数 310 15.10 door_bind、door_unbind和door_revoke函数 315 15.11 客户或服务器的过早终止 315 15.12 小结 321 习题 322 第16章 Sun RPC 323 16.1 概述 323 16.2 多线程化 330 16.3 服务器捆绑 333 16.4 认证 336 16.5 超时和重传 338 16.6 调用语义 342 16.7 客户或服务器的过早终止 343 16.8 XDR:外部数据表示 345 16.9 RPC分组格式 361 16.10 小结 365 习题 366 后记 368 附录A 性能测量 371 附录B 线程入门 406 附录C 杂凑的源代码 409 附录D 精选习题解答 417 参考文献 433 索引 435
### 回答1: 进程是操作系统中的一个重要概念,它是正在运行的程序的实例。在 Linux 系统中,进程管理是非常重要的一项任务,它涉及到进程的创建、销毁、监控和通信等操作。 在 Linux 中,有三个常用的进程管理函数:waitexec 和 system。 wait 函数用于等待子进程的结束,并获取它的退出状态。具体来说,wait 函数会挂起当前进程,直到它的子进程结束。然后,它会把子进程退出状态保存在一个指针参数中,以便当前进程可以读取这个状态。如果子进程被信号终止,wait 函数还可以获取信号的信息。 exec 函数用于替换当前进程的映像,即把当前进程的映像替换为一个新的程序。具体来说,exec 函数会调用一个指定的程序,并运行它,而不是当前进程中的程序。执行 exec 函数后,当前进程的 PID 和其他属性仍然是不变的,但是它的映像会被新的程序替换。 system 函数用于执行一个 shell 命令,并等待它的结束。具体来说,system 函数会调用一个 shell 进程,然后执行一个指定的命令,并等待命令执行完毕后再返回。它的返回值是 shell 命令的退出状态。 这三个函数都是进程管理中非常重要的工具,开发人员可以通过它们来实现进程的创建、执行和监控等操作。但是在使用这些函数时,我们需要注意安全性和系统性能,避免对系统造成不必要的影响。 ### 回答2: Linux进程管理中,waitexec、system是非常重要的三个命令,它们具有不同的作用和用法,能够帮助用户有效地管理进程wait命令用于等待一个进程结束并返回进程退出状态码,其语法为“wait [pid]”,其中pid表示要等待的进程ID。如果不指定pid,则wait会等待所有子进程结束并返回最后一个结束的子进程退出状态码。wait命令通常与fork和exec命令配合使用,可以方便地管理并发执行的多个进程exec命令用于在当前进程中执行新的命令,其语法为“exec [command]”,其中command表示要执行的命令。exec命令会将当前进程的地址空间清空,并把新的命令加载到其中,然后直接执行。因此,exec命令可以用于实现进程替换,即将当前进程替换为一个新的进程exec命令一般不会创建新的进程,而是直接在当前进程中执行新的命令,因此它可以用于在一个shell中执行另一个shell脚本,从而避免了创建多个进程的开销。 system命令可以在新的进程中执行指定的命令,并等待命令完成后返回退出状态码,其语法为“system [command]”,其中command表示要执行的命令。system命令会创建一个新的进程,并在其中执行指定的命令,然后等待命令完成,并返回退出状态码。system命令一般用于在shell脚本中执行命令并获取其返回值。 总之,waitexec、system这三个命令在Linux进程管理中非常重要,能够帮助用户高效地管理进程。通过这些命令的使用,用户可以方便地等待进程结束、实现进程替换、执行新的命令并获取结果等。其中的使用方法和技巧,需要根据实际应用场景加以理解和运用。 ### 回答3: 进程Linux操作系统的核心之一,而进程管理又是Linux系统运维和开发中非常重要的一项工作。Linux系统提供了多种进程管理命令,包括waitexec和system等命令。下面就分别介绍一下这三个命令的使用方法及其作用。 wait命令 wait命令是一种用于进程管理的命令。它的作用是等待指定的进程结束,并返回进程退出状态。在编写shell脚本时,我们通常需要等待子进程的结束,然后根据其退出状态来做出相应的处理。在这种情况下,wait命令可以非常方便地帮助我们实现这一功能。 wait命令的使用方法非常简单,只需要在命令行中输入wait,即可等待当前所有子进程结束,并返回状态值。 exec命令 exec命令是一个非常重要的进程管理命令,它的作用是用指定的命令替换当前的进程。通过exec命令,我们可以实现各种进程管理任务,包括重定向输入输出、执行后台任务等。exec命令还可以用于切换shell环境或者切换用户等功能。 exec命令的使用方法也非常简单,只需要在命令行中输入exec,然后输入要执行的命令即可。例如,我们可以使用exec命令将bash shell切换为zsh shell,只需要在命令行中输入exec zsh,就可以完成这一操作。 system命令 system命令是一个用于执行系统命令的命令。它的作用与在命令行中直接输入系统命令类似,可以帮助我们快速执行各种系统命令。当我们需要在脚本中执行一些特殊的系统命令时,可以使用system命令来实现。 system命令的使用方法也非常简单,只需要在命令行中输入system,然后输入要执行的系统命令即可。例如,我们可以使用system命令执行ls命令,只需要在命令行中输入system('ls'),就可以列出当前目录下所有文件和文件夹。需要注意的是,在使用system命令时,要保证输入的系统命令是可靠的,否则可能存在安全问题。 总之,Linux进程管理命令waitexec和system是Linux系统运维和开发中非常重要的工具,它们可以帮助我们快速实现各种进程管理任务和系统命令的执行。需要注意的是,在使用这些命令时,要保证操作的正确性和安全性,避免发生不必要的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值