Linux 多学习过程
1Linux流程概述
1.1进程标识
ppid:%d\n",getpid(),getppid());
1.2进程的用户ID与组ID
进程执行过程中必须有类似于用户的身份,哪个用户就是该用户的身份,就是那个用户的组
可用getuid(),getgid();获得
进程还有有效用户ID和有效组ID,缺少的情况下,与真实ID同样,能够用geteuid(),getegid();
文件权限有S的时候,有效ID是进程的全部者(创建者),否则有效ID就是程序的执行者,与真实ID同样
ps -aux查看全部用户进程的权限,cpu,和内存的使用情况
1.3进程的状态
1.4LInux下的进程结构
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveW91bmd5YW5neWFuZzA0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
1.5LInux下的进程管理
2 进程的创建
2.1system函数
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
using namespace std;
int main(int argc,char *argv[]){
char cmd[1024]="";
for(int i=1;i<argc;i++){
strcat(cmd,argv[i]);
strcat(cmd," ");
}
puts(cmd);
int ans;
ans=system(cmd);
printf("%x\n",ans);
}
用system调用其它可运行程序,并输入參数 输入比如: ./main ./my_add 当中my_add计算两个数之和
int main(int argc,char *argv[]){
if(argc!=2){
printf("failed\n");
return 0;
}
int left,right;
char cmd[1024]="";
char line[1024]="";
strcat(cmd,argv[1]);
strcat(cmd," ");
while(printf(">>"),scanf("%d %d",&left,&right)){
memset(line,0,sizeof(line));
sprintf(line,"%s %d %d",argv[1],left,right);
strcpy(cmd,line);
int ret;
ret=system(cmd);
printf("result:%d\n",ret/256);
}
}
2.2fork函数
#include<iostream>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
int main(int argc,char *argv[]){
pid_t pid;
int i=3;
printf("hello\n");
pid=fork();
fflush(stdout);//儿子复制的时候将缓冲区也复制了,假设没有这句话。上面的hello将出现两便
if(pid>0){
printf("parents:pid:%u,ret:%u,pp:%u\n",getpid(),pid,getppid());
}
else if(pid==0){
// sleep(5);
printf("child:pid:%u,ret:%u,pp:%u\n",getpid(),pid,getppid());
}
printf("bye!\n");
}
2.3exec函数
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
if(execl("/home/yang/0820/my_exec/","my_add","3","2",NULL)==-1){
perror("execl error");
}
int execlp(const char *file, const char *arg, ...);比如:
if(execlp("./my_add","my_add","fwef","fwe","fewgeraf",NULL)==-1){
perror("execlp error");
}
int execv(const char *path, char *const argv[]);比如:
char *args[10];
args[0]="my_add";
args[1]="12";
args[2]="23";
args[3]=NULL;
if(execv("/home/yang/0820/my_exec/my_add",args)==-1){
perror("execl:");
}
2.4popen函数(以后补充)
popen函数类似system函数,与system不同之处在于它使用管道操作,
FILE*popen(const char *command, const char *type);
int pclose(FILE *stream);
command为可运行文件的全路径和运行參数。type可选參数为“r” 或“w”
假设type是“w”(即当前的程序的输出结果作为commend命令的输入),调用程序能够用fwrite想调用程序发送数据,而被调用的程序能够在自己的标准输入上读取这些数据
FILE *fp;
char a[1000];
char b[1000];
char cmd[1024]="";
printf("plseas write\n");
fgets(a,1000,stdin);
sprintf(cmd,"%s %s",argv[1],a);
fp=popen(cmd,"r");//这个指令cmd为可运行文件的全路经
fgets(b,1000,fp);
printf("%s\n",b);
新进程屏幕输出:
FILE *fp;
char a[1000];
gets(a);
fp=popen(argv[1],"w");
fputs(a,fp);
pclose(fp);
3.进程控制与终止
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
pid_t pid = fork();
if( pid == 0 )
{
exit(10);
}
else
{
sleep(10); }
}
避免僵尸进程样例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
pid_t pid = fork();
if( pid == 0 )
{
exit(10);
}
else
{
wait(NULL); //NULL表示等待全部进程
sleep(10); //通常要将sleep放在wait的后面,要不然也会出现僵尸进程
}
}
3.2进程的终止
exit和_exit函数的原型:
#include<stdlib.h> //exit的头文件
#include<unistd.h> //_exit的头文件
void exit(int status);
void_exit(int status);
status是一个整型的參数,能够利用这个參数传递进程结束是的状态。0表示正常退出,其它数表示出现错误,进程非正常结束
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Linux 多学习过程的更多相关文章
- Linux嵌入式学习过程(转载)
嵌入式专业是一门实践性非常强的学科,只有多动手,多实践,多编程,多调试,多看书,多思考才能真正掌握好嵌入式开发技术.那么,如何从零开始学习嵌入式开发技术, 进入嵌入式开发大门呢,笔者根据自己的嵌入式学 ...
- Linux导航神器-----autojump
对于命令行用户来说,频繁的cd和tab应该是日常工作中最多使用的命令了.特别对于重度用户来说,如果可以省去这么多cd和tab,将更多的时间做有意义的事该多好.其实Linux的学习过程本身就行这样.你会 ...
- Linux安装及入门
Linux安装及学习 Linux遇到的问题: 在安装过程中因为代码输错(少空格)而质疑自己下载的ubuntu和virtualbox版本,于是卸载之后重新安装了一次,后来才发现是代码输错了(教程中的空格 ...
- 20165203 预备作业3 Linux安装及学习
一.安装虚拟机 1.下载问题:当自己在虚拟机上下载ubuntu时,总是下载好长时间,而且最后下载失败,这让我很苦恼. 解决方案:求助同学后,同学给了我一个中文版官网的网址http://cn.ubunt ...
- 【Linux】Linux文件跟目录管理
熟悉Linux的大家都知道,在Linux中,一切皆文件,可能在有些人的理解中,Linux跟我们的Windows差不多,是都具有图形操作界面的一种操作系统,但是更深入的来说,Linux更偏向于用命令操作 ...
- Re:从零开始的Linux之路(杂谈)
决定认真从零开始写一个Linux的学习过程,像我这么偷懒的人能写文字记录已经很不容易了,希望不要半途而废吧(拖走) 用多了Linux其实发现,要是哪天Linux和Windows能结合下就好了,简单粗暴 ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- linux学习之九 学习过程总结
~写在前面 首先非常感谢孟老师的悉心讲解,使用这种新颖的教学方式(MOOC课堂+博客),也感到非常有幸随着老师的思路对linux的内核进行了初步的系统学习.结合代码和gdb调试工具跟踪分析对linux ...
- linux学习过程中所需要看的一些书籍
入门类 一直认为,在一个系统上学习开发之前,首先需要熟悉这个系统的使用.鉴于天朝的国情,绝大部分人第一个接触的操作系统就是Windows,因此对于这绝大部分人来说,如果要学习Linux开发,学会使用这 ...
随机推荐
- RESTEasy:@FormParam、@PathParam、@QueryParam、@HeaderParam、@CookieParam、@MatrixParam说明
在第一RESTEasy教程我们已经学习了基本的Web服务和休息我们已经测试了一个简单的REST风格的Web服务.在本教程中,我们将显示如何将Web应用程序元素(形式参数,查询参数和更多)为REST风格 ...
- php中遍历数组的方法
参考网址:http://www.jb51.net/article/29949.htm 这三种方法中效率最高的是使用foreach语句遍历数组.从PHP4开始就引入了foreach结构,是PHP中专门为 ...
- B桥接模式ridge
1.一个简短的引论 1)模式概述:将抽象部分与实现部分分离.使它们都能够独立的变化.让抽象类和派生类各自实现自己的对象.当一个系统有多维度的变化时,将各个维度分离出来让它们独立于变化(多角度地分类实现 ...
- Jetty开发指导:Jetty Websocket API
Jetty WebSocket API使用 Jetty提供了功能更强的WebSocket API,使用一个公共的核心API供WebSockets的服务端和client使用. 他是一个基于WebSock ...
- POJ2239_Selecting Courses(二分图最大匹配)
解题报告 http://blog.csdn.net/juncoder/article/details/38154699 题目传送门 题意: 每天有12节课.一周上7天,一门课在一周有多天上课. 求一周 ...
- Flipping Game(枚举)
Flipping Game time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- core graphics path
当UIKit无法满足画图需求的时候.就须要用到Core Graphics API.当中最普遍的就是path. 一些重要的概念 graphics context 能够理解成canvas.在ios里相应C ...
- RTF 格式 说明
摘要: 本文对RTF文件格式进行分析研究,对RTF文件结构及特性进行了阐述,并分别列举了几个有用性的样例进行具体分析, 终于通过VB程序代码实现了一个RTF书写器(不具有所见即所得特性).本文对软件开 ...
- iOS Dev (55) 获得本年度、月、日本和其他信息
iOS Dev (55) 获得本年度.月.日本和其他信息 作者:大锐哥 博客:http://prevention.iteye.com - NSDate *now = [NSDate date]; NS ...
- poj 1789 Truck History(kruskal算法)
主题链接:http://poj.org/problem?id=1789 思维:一个一个点,每两行之间不懂得字符个数就看做是权值.然后用kruskal算法计算出最小生成树 我写了两个代码一个是用优先队列 ...