当前位置:文档之家› linux下的c函数之进程操作

linux下的c函数之进程操作

linux下的c函数之进程操作
linux下的c函数之进程操作

atexit(设置程序正常结束前调用的函数)

相关函数 _exit,exit,on_exit

表头文件 #include

定义函数 int atexit (void (*function)(void));

函数说明 atexit()用来设置一个程序正常结束前调用的函数。当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序。

返回值如果执行成功则返回0,否则返回-1,失败原因存于errno中。

范例 #include

void my_exit(void)

{

printf(“before exit () !\n”);

}

main()

{

atexit (my_exit);

exit(0);

}

执行 before exit()!

execl(执行文件)

相关函数 fork,execle,execlp,execv,execve,execvp

表头文件 #include

定义函数 int execl(const char * path,const char * arg,....);

函数说明 execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。

返回值如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。

范例 #include

main()

{

execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);

}

执行 /*执行/bin/ls -al /etc/passwd */

-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

execlp(从PATH 环境变量中查找文件并执行)

相关函数 fork,execl,execle,execv,execve,execvp

表头文件 #include

定义函数 int execlp(const char * file,const char * arg,……);

函数说明 execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。

返回值如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

错误代码参考execve()。

范例 /* 执行ls -al /etc/passwd execlp()会依PATH 变量中的/bin找到/bin/ls */

#include

main()

{

execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);

}

执行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

execv(执行文件)

相关函数 fork,execl,execle,execlp,execve,execvp

表头文件 #include

定义函数 int execv (const char * path, char * const argv[ ]);

函数说明 execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execve()只需两个参数,第二个参数利用数组指针来传递给执行文件。

返回值如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

错误代码请参考execve()。

范例 /* 执行/bin/ls -al /etc/passwd */

#include

main()

{

char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};

execv(“/bin/ls”,argv);

}

执行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

execve(执行文件)

相关函数 fork,execl,execle,execlp,execv,execvp

表头文件 #include

定义函数 int execve(const char * filename,char * const argv[ ],char * const envp[ ]);

函数说明 execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。

返回值如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

错误代码 EACCES

1. 欲执行的文件不具有用户可执行的权限。

2. 欲执行的文件所属的文件系统是以noexec 方式挂上。

3.欲执行的文件或script翻译器非一般文件。

EPERM

1.进程处于被追踪模式,执行者并不具有root权限,欲执行的文件具有SUID 或SGID 位。

2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具有SUID 或SGID 位元,但执行者并不具有root权限。

E2BIG 参数数组过大

ENOEXEC 无法判断欲执行文件的执行文件格式,有可能是格式错误或无法在此平台执行。EFAULT 参数filename所指的字符串地址超出可存取空间范围。

ENAMETOOLONG 参数filename所指的字符串太长。

ENOENT 参数filename字符串所指定的文件不存在。

ENOMEM 核心内存不足

ENOTDIR 参数filename字符串所包含的目录路径并非有效目录

EACCES 参数filename字符串所包含的目录路径无法存取,权限不足

ELOOP 过多的符号连接

ETXTBUSY 欲执行的文件已被其他进程打开而且正把数据写入该文件中

EIO I/O 存取错误

ENFILE 已达到系统所允许的打开文件总数。

EMFILE 已达到系统所允许单一进程所能打开的文件总数。

EINVAL 欲执行文件的ELF执行格式不只一个PT_INTERP节区

EISDIR ELF翻译器为一目录

ELIBBAD ELF翻译器有问题。

范例 #include

main()

{

char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char *)0};

char * envp[ ]={“PATH=/bin”,0}

execve(“/bin/ls”,argv,envp);

}

执行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

execvp(执行文件)

相关函数 fork,execl,execle,execlp,execv,execve

表头文件 #include

定义函数 int execvp(const char *file ,char * const argv []);

函数说明 execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后

便执行该文件,然后将第二个参数argv传给该欲执行的文件。

返回值如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。

错误代码请参考execve()。

范例 /*请与execlp()范例对照*/

#include

main()

{

char * argv[ ] ={ “ls”,”-al”,”/etc/passwd”,0};

execvp(“ls”,argv);

}

执行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

exit(正常结束进程)

相关函数 _exit,atexit,on_exit

表头文件 #include

定义函数 void exit(int status);

函数说明 exit()用来正常终结目前进程的执行,并把参数status返回给父进程,而进程所有的缓冲区数据会自动写回并关闭未关闭的文件。

返回值

范例参考wait()

_

exit(结束进程执行)

相关函数 exit,wait,abort

表头文件 #include

定义函数 void _exit(int status);

函数说明 _exit()用来立刻结束目前进程的执行,并把参数status返回给父进程,并关闭未关闭的文件。此函数调用后不会返回,并且会传递SIGCHLD信号给父进程,父进程可以由wait函数取得子进程结束状态。

返回值

附加说明 _exit()不会处理标准I/O 缓冲区,如要更新缓冲区请使用exit()。

vfork(建立一个新的进程)

相关函数 wait,execve

表头文件 #include

定义函数 pid_t vfork(void);

函数说明 vfork()会产生一个新的子进程,其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码,组代码,环境变量、已打开的文件代码、工作目录和资源限制等。Linux 使用copy-on-write(COW)技术,只有当其中一进程试图修改欲复制的空间时才会做真正的复制动作,由于这些继承的信息是复制而来,并非指相同的内存空间,因此子进程对这些变量的修改和父进程并不会同步。此外,子进程不会继承父进程的文件锁定和未处理的信号。注意,Linux不保证子进程会比父进程先执行或晚执行,因此编写程序时要留意

死锁或竞争条件的发生。

返回值如果vfork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。如果vfork 失败则直接返回-1,失败原因存于errno中。

错误代码 EAGAIN 内存不足。ENOMEM 内存不足,无法配置核心所需的数据结构空间。

范例 #include

main()

{

if(vfork() = =0)

{

printf(“This is the child process\n”);

}else{

printf(“This is the parent process\n”);

}

}

执行 this is the parent process

this is the child process

getpgid(取得进程组识别码)

相关函数 setpgid,setpgrp,getpgrp

表头文件 #include

定义函数 pid_t getpgid( pid_t pid);

函数说明 getpgid()用来取得参数pid 指定进程所属的组识别码。如果参数pid为0,则会取得目前进程的组识别码。

返回值执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。

错误代码 ESRCH 找不到符合参数pid 指定的进程。

范例 /*取得init 进程(pid=1)的组识别码*/

#include

mian()

{

printf(“init gid = %d\n”,getpgid(1));

}

执行 init gid = 0

getpgrp(取得进程组识别码)

相关函数 setpgid,getpgid,getpgrp

表头文件 #include

定义函数 pid_t getpgrp(void);

函数说明 getpgrp()用来取得目前进程所属的组识别码。此函数相当于调用getpgid(0);

返回值返回目前进程所属的组识别码。

范例 #include

main()

{

printf(“my gid =%d\n”,getpgrp());

}

执行 my gid =29546

getpid(取得进程识别码)

相关函数 fork,kill,getpid

表头文件 #include

定义函数 pid_t getpid(void);

函数说明 getpid()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。

返回值目前进程的进程识别码

范例 #include

main()

{

printf(“pid=%d\n”,getpid());

}

执行 pid=1494 /*每次执行结果都不一定相同*/

getppid(取得父进程的进程识别码)

相关函数 fork,kill,getpid

表头文件 #include

定义函数 pid_t getppid(void);

函数说明 getppid()用来取得目前进程的父进程识别码。

返回值目前进程的父进程识别码。

范例 #include

main()

{

printf(“My parent ‘pid =%d\n”,getppid());

}

执行 My parent pid =463

getpriority(取得程序进程执行优先权)

相关函数 setpriority,nice

表头文件 #include

#include

定义函数 int getpriority(int which,int who);

函数说明 getpriority()可用来取得进程、进程组和用户的进程执行优先权。

参数 which有三种数值,参数who 则依which值有不同定义

which who 代表的意义

PRIO_PROCESS who 为进程识别码

PRIO_PGRP who 为进程的组识别码

PRIO_USER who 为用户识别码

此函数返回的数值介于-20 至20之间,代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。

返回值返回进程执行优先权,如有错误发生返回值则为-1 且错误原因存于errno。

附加说明由于返回值有可能是-1,因此要同时检查errno是否存有错误原因。最好在调用次函数前先清除errno变量。

错误代码 ESRCH 参数which或who 可能有错,而找不到符合的进程。EINVAL 参数which 值错误。

nice(改变进程优先顺序)

相关函数 setpriority,getpriority

表头文件 #include

定义函数 int nice(int inc);

函数说明 nice()用来改变进程的进程执行优先顺序。参数inc数值越大则优先顺序排在越后面,即表示进程执行会越慢。只有超级用户才能使用负的inc 值,代表优先顺序排在前面,进程执行会较快。

返回值如果执行成功则返回0,否则返回-1,失败原因存于errno中。

错误代码 EPERM 一般用户企图转用负的参数inc值改变进程优先顺序。

on_exit(设置程序正常结束前调用的函数)

相关函数 _exit,atexit,exit

表头文件 #include

定义函数 int on_exit(void (* function)(int, void*),void *arg);

函数说明 on_exit()用来设置一个程序正常结束前调用的函数。当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序。参数arg指针会传给参数function函数,详细情况请见范例。

返回值如果执行成功则返回0,否则返回-1,失败原因存于errno中。

附加说明

范例 #include

void my_exit(int status,void *arg)

{

printf(“before exit()!\n”);

printf(“exit (%d)\n”,status);

printf(“arg = %s\n”,(char*)arg);

}

main()

{

char * str=”test”;

on_exit(my_exit,(void *)str);

exit(1234);

}

执行 before exit()!

exit (1234)

arg = test

setpgid(设置进程组识别码)

相关函数 getpgid,setpgrp,getpgrp

表头文件 #include

定义函数 int setpgid(pid_t pid,pid_t pgid);

函数说明 setpgid()将参数pid 指定进程所属的组识别码设为参数pgid 指定的组识别码。如果参数pid 为0,则会用来设置目前进程的组识别码,如果参数pgid为0,则会以目前进程的进程识别码来取代。

返回值执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。

错误代码 EINVAL 参数pgid小于0。

EPERM 进程权限不足,无法完成调用。

ESRCH 找不到符合参数pid指定的进程。

setpgrp(设置进程组识别码)

相关函数 getpgid,setpgid,getpgrp

表头文件 #include

定义函数 int setpgrp(void);

函数说明 setpgrp()将目前进程所属的组识别码设为目前进程的进程识别码。此函数相当于调用setpgid(0,0)。

返回值执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。

setpriority(设置程序进程执行优先权)

相关函数 getpriority,nice

表头文件 #include

#include

定义函数 int setpriority(int which,int who, int prio);

函数说明 setpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which 有三种数值,参数who 则依which值有不同定义

which who 代表的意义

PRIO_PROCESS who为进程识别码

PRIO_PGRP who 为进程的组识别码

PRIO_USER who为用户识别码

参数prio介于-20 至20 之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。此优先权默认是0,而只有超级用户(root)允许降低此值。

返回值执行成功则返回0,如果有错误发生返回值则为-1,错误原因存于errno。ESRCH 参数which或who 可能有错,而找不到符合的进程

EINVAL 参数which值错误。

EPERM 权限不够,无法完成设置

EACCES 一般用户无法降低优先权

system(执行shell 命令)

相关函数 fork,execve,waitpid,popen

表头文件 #include

定义函数 int system(const char * string);

函数说明 system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。

返回值如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果system()调用成功则最后会返回执行shell 命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。

附加说明在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。

范例 #include

main()

{

system(“ls -al /etc/passwd /etc/shadow”);

}

执行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow

wait(等待子进程中断或结束)

相关函数 waitpid,fork

表头文件 #include

#include

定义函数 pid_t wait (int * status);

函数说明 wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则

参数 status可以设成NULL。子进程的结束状态值请参考waitpid()。

返回值如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。

附加说明

范例 #include

#include

#include

#include

main()

{

pid_t pid;

int status,i;

if(fork()= =0){

printf(“This is the child process .pid =%d\n”,getpid());

exit(5);

}else{

sleep(1);

printf(“This is the parent process ,wait for child...\n”;

pid=wait(&status);

i=WEXITSTATUS(status);

printf(“child’s pid =%d .exit status=^d\n”,pid,i);

}

}

执行 This is the child process.pid=1501

This is the parent process .wait for child...

child’s pid =1501,exit status =5

waitpid(等待子进程中断或结束)

相关函数 wait,fork

表头文件 #include

#include

定义函数 pid_t waitpid(pid_t pid,int * status,int options);

函数说明 waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status可以设成NULL。参数pid为欲等待的子进程识别码,其他数值意义如下:

pid<-1 等待进程组识别码为pid绝对值的任何子进程。

pid=-1 等待任何子进程,相当于wait()。

pid=0 等待进程组识别码与目前进程相同的任何子进程。

pid>0 等待任何子进程识别码为pid的子进程。

参数option可以为0 或下面的OR 组合

WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待。

WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。

子进程的结束状态返回后存于status,底下有几个宏可判别结束情况

WIFEXITED(status)如果子进程正常结束则为非0值。

WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。

WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真

WTERMSIG(status)取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。

WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。

WSTOPSIG(status)取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。

返回值如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。

范例参考wait()。

fprintf(格式化输出数据至文件)

相关函数 printf,fscanf,vfprintf

表头文件 #include

定义函数 int fprintf(FILE * stream, const char * format,.......);

函数说明 fprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束('\0')为止。

返回值关于参数format字符串的格式请参考printf()。成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。

范例 #include

main()

{

int i = 150;

int j = -100;

double k = 3.14159;

fprintf(stdout,”%d %f %x \n”,j,k,i);

fprintf(stdout,”%2d %*d\n”,i,2,i);

}

执行 -100 3.141590 96

150 150

fscanf(格式化字符串输入)

相关函数 scanf,sscanf

表头文件 #include

定义函数 int fscanf(FILE * stream ,const char *format,....);

函数说明 fscanf()会自参数stream的文件流中读取字符串,再根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结构存于对应的参数内。

返回值成功则返回参数数目,失败则返回-1,错误原因存于errno中。

附加说明

范例 #include

main()

{

int i;

unsigned int j;

char s[5];

fscanf(stdin,”%d %x %5[a-z] %*s %f”,&i,&j,s,s);

printf(“%d %d %s \n”,i,j,s);

}

执行 10 0x1b aaaaaaaaa bbbbbbbbbb /*从键盘输入*/

10 27 aaaaa

printf(格式化输出数据)

相关函数 scanf,snprintf

表头文件 #include

定义函数 int printf(const char * format,.............);

函数说明 printf()会根据参数format字符串来转换并格式化数据,然后将结果写出到标准输出设备,直到出现字符串结束('\0')为止。参数format字符串可包含下列三种字符类型

1.一般文本,伴随直接输出。

2.ASCII控制字符,如\t、\n等。

3.格式转换字符。

格式转换为一个百分比符号(%)及其后的格式字符所组成。一般而言,每个%符号在其后都必需有一printf()的参数与之相呼应(只有当%%转换字符出现时会直接输出%字符),而欲输出的数据类型必须与其相对应的转换字符类型相同。

Printf()格式转换的一般形式如下

%(flags)(width)(.prec)type

以中括号括起来的参数为选择性参数,而%与type则是必要的。底下先介绍type的几种形式

整数

%d 整数的参数会被转成一有符号的十进制数字

%u 整数的参数会被转成一无符号的十进制数字

%o 整数的参数会被转成一无符号的八进制数字

%x 整数的参数会被转成一无符号的十六进制数字,并以小写abcdef表示

%X 整数的参数会被转成一无符号的十六进制数字,并以大写ABCDEF表示浮点型数

%f double 型的参数会被转成十进制数字,并取到小数点以下六位,四舍五入。

%e double型的参数以指数形式打印,有一个数字会在小数点前,六位数字在小数点后,而在指数部分会以小写的e来表示。

%E 与%e作用相同,唯一区别是指数部分将以大写的E 来表示。

%g double 型的参数会自动选择以%f 或%e 的格式来打印,其标准是根据欲打印的数值及

所设置的有效位数来决定。

%G 与%g 作用相同,唯一区别在以指数形态打印时会选择%E 格式。

字符及字符串

%c 整型数的参数会被转成unsigned char型打印出。

%s 指向字符串的参数会被逐字输出,直到出现NULL字符为止

%p 如果是参数是“void *”型指针则使用十六进制格式显示。

prec 有几种情况

1. 正整数的最小位数。

2.在浮点型数中代表小数位数

3.在%g 格式代表有效位数的最大值。

4.在%s格式代表字符串的最大长度。

5.若为×符号则代表下个参数值为最大长度。

width为参数的最小长度,若此栏并非数值,而是*符号,则表示以下一个参数当做参数长度。flags 有下列几种情况

#NAME?

+ 一般在打印负数时,printf()会加印一个负号,整数则不加任何负号。此旗标会使得在打印正数前多一个正号(+)。

# 此旗标会根据其后转换字符的不同而有不同含义。当在类型为o 之前(如%#o),则会在打印八进制数值前多印一个o。

而在类型为x 之前(%#x)则会在打印十六进制数前多印’0x’,在型态为e、E、f、g或G 之前则会强迫数值打印小数点。在类型为g 或G之前时则同时保留小数点及小数位数末尾的零。

0 当有指定参数时,无数字的参数将补上0。默认是关闭此旗标,所以一般会打印出空白字符。

返回值成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。

范例 #include

main()

{

int i = 150;

int j = -100;

double k = 3.14159;

printf(“%d %f %x\n”,j,k,i);

printf(“%2d %*d\n”,i,2,i); /*参数2 会代入格式*中,而与%2d同意义*/

}

执行 -100 3.14159 96

150 150

sacnf(格式化字符串输入)

相关函数 fscanf,snprintf

表头文件 #include

定义函数 int scanf(const char * format,.......);

函数说明 scanf()会将输入的数据根据参数format字符串来转换并格式化数据。Scanf()格式转换的一般形式如下

%[*][size][l][h]type

以中括号括起来的参数为选择性参数,而%与type则是必要的。

* 代表该对应的参数数据忽略不保存。

size 为允许参数输入的数据长度。

l 输入的数据数值以long int 或double型保存。

h 输入的数据数值以short int 型保存。

底下介绍type的几种形式

%d 输入的数据会被转成一有符号的十进制数字(int)。

%i 输入的数据会被转成一有符号的十进制数字,若输入数据以“0x”或“0X”开头代表转换十六进制数字,若以“0”开头则转换八进制数字,其他情况代表十进制。

%0 输入的数据会被转换成一无符号的八进制数字。

%u 输入的数据会被转换成一无符号的正整数。

%x 输入的数据为无符号的十六进制数字,转换后存于unsigned int型变量。

%X 同%x

%f 输入的数据为有符号的浮点型数,转换后存于float型变量。

%e 同%f

%E 同%f

%g 同%f

%s 输入数据为以空格字符为终止的字符串。

%c 输入数据为单一字符。

[] 读取数据但只允许括号内的字符。如[a-z]。

[^] 读取数据但不允许中括号的^符号后的字符出现,如[^0-9].

返回值成功则返回参数数目,失败则返回-1,错误原因存于errno中。

范例 #include

main()

{

int i;

unsigned int j;

char s[5];

scanf(“%d %x %5[a-z] %*s %f”,&i,&j,s,s);

printf(“%d %d %s\n”,i,j,s);

}

执行 10 0x1b aaaaaaaaaa bbbbbbbbbb

10 27 aaaaa

sprintf(格式化字符串复制)

相关函数 printf,sprintf

表头文件 #include

定义函数 int sprintf( char *str,const char * format,.........);

函数说明 sprintf()会根据参数format字符串来转换并格式化数据,然后将结果复制到参数str所指的字符串数组,直到出现字符串结束(’\0’)为止。关于参数format字符串的格式请参考printf()。

返回值成功则返回参数str字符串长度,失败则返回-1,错误原因存于errno中。

附加说明使用此函数得留意堆栈溢出,或改用snprintf()。

范例 #include

main()

{

char * a=”This is string A!”;

char buf[80];

sprintf(buf,”>>> %s<<<\n”,a);

printf(“%s”.buf);

}

执行 >>>This is string A!<<<

sscanf(格式化字符串输入)

相关函数 scanf,fscanf

表头文件 #include

linux进程控制 实验报告

长安大学 操作系统实验报告 实验课程:操作系统 实验名称:linux进程控制 学院:信息学院 专业:软件工程 学号:2406090106 姓名:刘建 日期:2012-5-09

一、实验目的 熟悉进程的创建过程,了解系统调用函数fork() 和execl()。 二、实验内容 1、阅读实例代码fork1,并编辑、编译、运行,记录程序的运行结果,尝试给出合理的解释,查阅有关资料,掌握系统调用fork( )的用法,返回值的意义。 2、阅读实例代码fork2,并编辑、编译、运行,记录程序的运行结果,尝试给出合理的解释,查阅有关资料,掌握在程序中运行一个操作系统命令和运行一个程序的方法。 3、修改fork2,使之能把运行的命令和程序作为参数传给fork2。 三、设计思想 1、程序框架

pid = -1 pid = 0pid> 0 2、用到的文件系统调用函数 fork() 和execl() 四、调试过程 1、测试数据设计 (1)fork1 命名程序1: 编写程序1:

编译程序1: 运行程序1: (2)fork2

编写程序2: 运行程序2:

(3)修改fork2 编写修改程序2: 修改后的运行结果: 2、测试结果分析 (1)对于程序1:因为系统调用fork()函数是一次调用两次返回值,而且先生成子进程还是父进程是不确定的,所以第一次执行生成子进程的时候返回的pid = 0,判断pid!=-1,所以输出了I’m the child. I’m the parent. 第二次,执行父进程的时候,返回的是子进程的进程号pid> 0,即pid的值仍然不为-1,所以又输出了一次I’m the child. I’m the parent。 (2)对于程序2:第一次调用fork()函数时,由于执行的是子进程还是父进程是随机的,所以第一次对父进程返回的是子进程的进程号(大于0),即pid> 0,所以输出I’m the parent. Program end.当第二次执行子进程时返回值是0,即pid = 0,所以输出I’m the child. 并调用了execl()函数,查看了指定路径中的文件。

Linux操作系统基础教程

Linux操作系统基础教程 清华大学信息学院计算机系 目录 前言 (2) 第一讲 Linux基础 (2) 一.什么是Linux? (2) 二.安装Linux的好处? (3) 三.如何得到Linux? (3) 四.如何得到Linux的最新消息? (3) 五.Linux操作系统上有什么应用? (4) 六.在那里可以找到讨论区? (5) 七.安装过程 (5) 第二讲 Linux基础进阶 (5) 一.Linux的文件系统结构 (6) 二. 文件类型 (7) 三.Linux基本操作命令 (8) 四.基本的系统管理命令 (14) 五.关於 Process 处理的指令 (16) 六. 关於字串处理的指令 (17) 七. 网路上查询状况的指令 (17) 八. 网路指令 (18) 九. 关於通讯用的指令 (21) 十. 编译器( Compiler ) (22) 十一. 有关列印的指令 (22) 第三讲 Linux下的网络服务,配置问题和常用工具 (24) 一.Linux下的网络服务 (24) 二.几种重要的配置文件 (26) 三.Linux下常用的工具软件 (28) 尾语 (31)

前言 Linux是在1991年发展起来的与UNIX兼容的操作系统,可以免费使用,它的源代码可以自由传播且可任人修改、充实、发展,开发者的初衷是要共同创造一个完美、理想并可以免费使用的操作系统。 我们并不能使同学们通过这次系列讲座成为一个UNIX类操作系统的高手,这次系列讲座的目的就是在同学们中间普及Linux基础知识,为今后我们更加接近的了解Linux做一个好的开端。 第一讲 Linux基础 在这一讲中,我们主要是了解一下Linux的概况,以及对Linux有一个初步的感性认识。 一.什么是Linux? Linux是一个以Intel系列CPU(CYRIX,AMD的CPU也可以)为硬件平台,完全免费的UNIX兼容系统,完全适用于个人的PC。它本身就是一个完整的32位的多用户多任务操作系统,因此不需要先安装DOS或其他的操作系统(MS Windows, OS2, MINIX..)就可以进行直接的安装。Linux的最早起源是在1991年10月5日由一位芬兰的大学生Linux Torvalds (Torvalds@kruuna.helsinki.fi)写了Linux核心程序的0.02版开始的,但其后的发展却几乎都是由互联网上的Linux社团(Linux Community)互通交流而完成的。Linux不属于任何一家公司或个人,任何人都可以免费取得甚至修改它的源代码(source code)。Linux上的大部分软件都是由GNU倡导发展起来的,所以软件通常都会在附着GNU Public License(GPL)的情况下被自由传播。GPL是一种可以使你免费获得自由软件的许可证,因此Linux使用者的使用活动基本不受限制(只要你不将它用于商业目的),而不必像使用微软产品是那样,

Linux 查看进程和删除进程

1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab)。 2. ps 命令用于查看当前正在运行的进程。 grep 是搜索 例如: ps -ef | grep java 表示查看所有进程里 CMD 是 java 的进程信息 ps -aux | grep java -aux 显示所有状态 ps 3. kill 命令用于终止进程 例如: kill -9 [PID] -9 表示强迫进程立即停止 通常用 ps 查看进程 PID ,用 kill 命令终止进程 网上关于这两块的内容 ----------------------------------------------------------------------------------- PS ----------------------------------------------------------------------------------- 1. ps 简介 ps 命令就是最根本相应情况下也是相当强大地进程查看命令.运用该命令可以确定有哪些进程正在运行和运行地状态、进程是否结束、进程有没有僵死、哪些进程占用了过多地资源等等.总之大部分信息均为可以通过执行该命令得到地. 2. ps 命令及其参数 ps 命令最经常使用地还是用于监控后台进程地工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设 备进行通信地,所以如果需要检测其情况,便可以运用 ps 命令了. 该命令语法格式如下: ps [选项] -e 显示所有进程,环境变量 -f 全格式 -h 不显示标题 -l 长格式 -w 宽输出 a 显示终端上地所有进程,包括其他用户地进程 r 只显示正在运行地进程 x 显示没有控制终端地进程 O[+|-] k1 [,[+|-] k2 [,…]] 根据 SHORT KEYS、k1、k2 中快捷键指定地多级排序顺序显示进程列表. 对于 ps 地不同格式都存在着默认地顺序指定.这些默认顺序可以被用户地指定所覆盖.在这里面“+”字符是可选地,“-” 字符是倒转指定键地方向. pids 只列出进程标识符,之间运用逗号分隔.该进程列表必须在命令行参数地最后一个选项后面紧接着给出,中间不能插入空格.比如:ps -f1,4,5.

linux实验项目 进程控制操作

重庆电力高等专科学校 实 验 报 告 书 实验名称:Linux文件命令学院:信息工程学院 指导老师:黄泽伟 班级:软件1311 学号:201303100243 姓名:周贵波

实验项目进程控制操作 一、实验目的 1.了解进程的概念。 2.熟悉Linux的前台与后台进程控制操作。 3.掌握利用进程监控工具来维护系统的正常运行。 二、实验环境 安装了Red Hat Linux9.0和windows虚拟机系统的计算机一台。 三、实验内容 1.Linux的前台与后台进程控制操作。 2.系统监视器(system monitor)的使用和系统维护。 四、实验步骤 1.进程的前台工作方式 1)yes ok ←┘ 终端窗口显示___ok___,此时键盘能否输入其它命令____不能___,为什么? 2)按键:Ctrl+Z,暂停一个前台进程的运行,并转为挂起进程。 3)jobs ←┘记录下看到的结果_____yes ok_________________。 4)fg %1 ←┘作用:把挂起进程转为前台进程执行; 5)再按键:Ctrl+Z 作用与2)相同; 6)jobs ←┘记录下看到的结果________yes ok______________。 7)bg %1 ←┘作用:重新运行挂起进程,但以后台方式运行; 8)此时能否再按键:Ctrl+Z暂停一个后台进程的运行?____不能__,

键盘能否输入其它命令__不能_____,为什么? 9)用鼠标点击,关闭终端窗口。 2.进程的后台工作方式 除上面把前台进程转到后台进程的过程外,一般在shell提示符下,输入的命令后加上&,即以后台方式运行命令。再次进入终端方式。 1)xclock & ←┘后台进程1,记录其时钟的时间___16:40____ xcalc & ←┘后台进程2 find / -name ?*.jpg‘–print > templist & ←┘后台进程3 2)jobs ←┘有几个后台进程:__2______,记录显示结果: xclock xcalc & ps ←┘记录下看到的结果: 4036 pts/0 00:00:00 bash 4061 pts/0 00:00:00 xcalc 4063 pts/0 00:00:00 ps 3)fg %1 ←┘将时钟进程转到前台运行。 4)按键:Ctrl+Z, 将时钟进程挂起,记录时钟的时间___16:50______。 jobs ←┘观察显示结果____xcalc &________________。 回顾上述操作,经过二~三分钟后,看图形时钟有走动吗?____否___。 5)bg %1 ←┘ 将挂起的时钟进程转到后运行,现在再观察时钟是否会有变化,为什么? 有后台继续运行 jobs ←┘ kill %2 ←┘杀死计算器进程,看计算器是否消失__否______。 6)ps ←┘ 观察屏幕显示,记录时钟(xclock)进程的进程号pid=__________。 7)kill ←┘ pid为xclock的进程号,作用__newline____________。 试比较与上述步骤5)中的kill命令的区别。 8)ls –l ←┘是否有templist文件? ____否____。 9)rm templist ←┘删除临时文件。

实验2:Linux操作系统基本操作

实验报告2 课程名称:Linux程序设计实验名称:Linux操作系统基本操作 学生姓名:班级:学号: 指导老师:钱振江成绩: 一、实验目的 1.通过对emacs、vi、vim、gedit文本编辑器的使用,掌握在Linux环境下文本文件的编辑方法; 2.通过对常用命令mkdir、cp、cd、ls、mv、chmod、rm等文件命令的操作,掌握Linux操作系统中文件命令的用法。 二、实验任务与要求 1.emacs的使用,要求能新建、编辑、保存一个文本文件 2.vi或vim的使用,要求能新建、编辑、保存一个文本文件 3.gedit的使用,要求能新建、编辑、保存一个文本文件 4.掌握mkdir、cd命令的操作,要求能建立目录、进入与退出目录 5.掌握cp、ls、mv、chmod、rm等命令的操作,要求能拷贝文件、新建文件、查看文件、文件重命名、删除文件等操作。 三、实验工具与准备 计算机PC机,Linux Ubuntu操作系统 预备知识 文本编辑器emacs、gedit是一款图形化的编辑器,具体的使用方法按照菜单操作。文本编辑器vi有三种状态:命令状态、最后行状态、编辑状态。 mv:用来为文件或目录改名,或者将文件由一个目录移入另一个目录中,它的使用权限是所有用户。 rm:删除文件或目录,参数-r指示rm将参数中列出的全部目录和子目录均递归删除,在使用rm命令要小心,因为一旦被删除,它是不能恢复的。 cp:将一个文件拷贝至另一文件,或将数个文件拷贝至另一目录。 chmod:用于改变文件或目录的访问权限,它的使用格式为: chmod [who] [+|-|=] [mode] 文件名 who可取u、g、o、a,或它们的组合 mode可取r、w、x等参数。 ls:用于显示目录内容,它的使用权限是所有用户。 mkdir:建立子目录,它的使用权限是所有用户。 四、实验步骤与操作指导 1.学习vi或者vim的使用,要求能新建、编辑、保存一个文本文件。 (1)点击”应用程序”→ “附件”→“终端”,打开终端,在终端输入命令: [root@localhost root]#vi kk.c 按i键,进入插入状态。 (2)输入以下C程序 #include

【IT专家】Linux中进程的几种状态

本文由我司收集整编,推荐下载,如有疑问,请与我司联系 Linux中进程的几种状态 2015/03/29 4411 1R (task_running) :可执行状态 ?只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。 ?很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为TASK_RUNNING状态。 ? 2S (task_interruptible):可中断的睡眠状态 ?处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。 ?通过ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于task_interruptible状态(除非机器的负载很高)。毕竟CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来。 ? 3D (task_uninterrupible)不可中断的睡眠状态 ?与task_interruptible状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。但是uninterruptible sleep状态的进程不接受外来的任何信号,因此无法用kill杀掉这些处于D状态的进程,无论是”kill”, “kill -9″还是”kill -15″,这种情况下,一个可选的方法就是reboot。

Linux 基本操作练习题

《Linux基本操作》练习题 1. 已知当前目录有如下文件:arp,egp,ggp,icmp,dip,ip,ipip,pup,rawip,riptcp,udp。写出以下echo命令的输出: (1) echo *ip (2) echo ?d* (3) echo [aegi]?p 答:(1)dip ip ipip rawip (2)udp (3)arp egp qqp 2. 下列各对命令有何不同? (1) ls/home echo /home (2) ls echo (3) ls * echo * 答(1)ls/home表示列出/home中的文件名。echo/home表示在屏幕中打印出字符串/home。(2)ls 列出目录和文件,echo用来在屏幕上显示一段文字,一般起到提示作用。 (3)两者均表示列出目录中的所有文件,但后者显示在同一行。 3. 解释下列信息描述的文件类型和存取权限: (1) drwxr-xr-x (2) –rwx- -x- - x (3) crw-rw- - - - 答:(1)目录,创建者可读可写可进入该目录,同组用户可读可进,其他用户仅可读可进。 (2)普通文件,创建者可读可写可执行,同组与其他用户只可执行。 (3)字符设备,所属者与通用组可进行读写。 4. 已知用户主目录的访问权限是700,该目录下的memo文件的访问权限是777,其他人可以读取这个文件吗?为什么? 答:700对其他人的权限为0,即不允许对该目录进行操作,故其内的文件也不可读。 5. 设temp是一个非空目录,说明下面3个命令的执行结果: (1) rm –r temp (2) rm –r temp/* (3) rmdir temp 答:(1)删除temp及所含内容。 (2)删除/temp下的所有目录及所含文件。 (3)不能完成操作,提示目录非空。 6. 给出命令,将主目录下的.profile文件复制到主目录下的backup目录下。如果目标文件已存在,提示用户是否覆盖? 答:cp-i/home/.profile/backup 7. 设某文件myfile的权限为-rw-r- - r - -,若要增加所有人可执行的权限,应使用什么命令,如何增加该权限? 答:chmod o+x myfile 8. 若要用date 命令显示格式为“Beijing Time:hh: mm: ss”的时间,应使用什么格式参数?答:date +”Beijing Time %T”

Linux程序设计上机指导书3:Linux进程控制

上机三:Linux进程控制 1.目的 (1)掌握系统调用fork(),exex(),exit()等实现进程创建; (2)掌握进程的终止方式(return、exit、_exit、abort); (3)掌握僵尸进程的产生和避免,以及wait,waitpid的使用; (4)了解守护进程的创建。 2.内容 主要上机分析代码文件。 systemtest.c 6-3.c 6-4.c 6-8.c 6-9.c 其他略。 3.步骤 1)Linux进程的创建 创建进程可以采用几种方式。可以执行一个程序(这会导致新进程的创建),也可以在程序内调用一个fork 或exec来创建新进程。fork 调用会导致创建一个子进程,而exec 调用则会用新程序代替当前进程上下文。exec系列函数并不创建新进程,调用exec前后的进程ID是相同的。

exec函数的主要工作是清除父进程的可执行代码映像,用新程序的代码覆盖调用exec 的进程代码。如果exec执行成功,进程将从新程序的main函数入口开始执行。调用exec 后,除进程ID保持不变外,还有下列进程属性也保持不变。 (1)进程的父进程ID。 (2)实际用户ID和实际用户组ID。 (3)进程组ID、会话ID和控制终端。 (4)定时器的剩余时间。 (5)当前工作目录及根目录。 (6)文件创建掩码UMASK。 (7)进程的信号掩码。 与exec系统调用不同,system将外部可执行程序加载执行完毕后继续返回调用进程。 【例6.3】设计一个程序,用fork函数创建一个子进程,在子进程中,要求显示子进程号与父进程号,然后显示当前目录下的文件信息,在父进程中同样显示子进程号与父进程号。

Linux下查看进程和线程

在Linux中查看线程数的三种方法 1、top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。 2、ps xH 手册中说:H Show threads as if they were processes 这样可以查看所有存在的线程。 3、ps -mp 手册中说:m Show threads after processes 这样可以查看一个进程起的线程数。 查看进程 1. top 命令 top命令查看系统的资源状况 load average表示在过去的一段时间内有多少个进程企图独占CPU zombie 进程:不是异常情况。一个进程从创建到结束在最后那一段时间遍是僵尸。留在内存中等待父进程取的东西便是僵尸。任何程序都有僵尸状态,它占用一点内存资源,仅仅是表象而已不必害怕。如果程序有问题有机会遇见,解决大批量僵尸简单有效的办法是重起。kill是无任何效果的stop模式:与sleep进程应区别,sleep会主动放弃cpu,而stop 是被动放弃cpu ,例单步跟踪,stop(暂停)的进程是无法自己回到运行状态的。 cpu states: nice:让出百分比irq:中断处理占用 idle:空间占用百分比iowait:输入输出等待(如果它很大说明外存有瓶颈,需要升级硬盘(SCSI)) Mem:内存情况 设计思想:把资源省下来不用便是浪费,如添加内存后free值会不变,buff值会增大。判断物理内存够不够,看交换分区的使用状态。 交互命令: [Space]立即刷新显示 [h]显示帮助屏幕

Linux基本操作练习题

Linux基本操作练习题 福州星网视易信息系统有限公司 更新记录: 版本作者日期内容1.0 卢廉瑾2010-05-18 创建 1.1 卢廉瑾2010-08-10 修改

一、简答题: 1、问:登录虚拟机器,如何查看你位于虚拟机的哪个目录下,为 什么你登录时会跑到这个目录下?在这个目录下,输入ls,然后输入ls –a。问:两次出来的文件数量一样吗?如果不一样,那些多出来或者少掉的文件有什么特征? 答: (1)PWD (2)根据配置文件/etc/passwd里面设置 (3)不一样 (4)多了. 开头的隐含文件。 2、问:在你的家目录下,建立一个文件MyPrivate,查看一下, 不同的人对它有什么权限?如果要把它改成任何人都能读写的,请问要输入什么命令?现在我想把它改名成MyPublic,怎么操作。 然后我要在根目录下建立一个软链接MyShortCut到MyPublic,该怎么操作? 答: (1)-rw-r—r—自己有读写,同组用户有读,其他用户有读 (2)chmod 777 MyPrivate (3)mv MyPrivate MyPublic (4)Ln –s /home/yy/MyPublic /MyShortCut 3、问:找出你的虚拟机上文件类型为“-”“d”“l”“b”“c”的 文件各一个(给出绝对路径),这几种类型分别表示什么意思? 答: (1)/etc/cron.d /usr/share/doc/bc/examples/pi.b /home/yy/c_test/1.c (2). .c: 是C语言源程序 4、问:新建一个文件myhello.cpp,编辑这个文件如下: #include #include

2011180021-Linux操作系统-课程设计报告-基于Linux的进程调度模拟程序

河南中医学院 《linux操作系统》课程设计报告 题目:基于Linux的进程调度模拟程序 所在院系:信息技术学院 专业年级:2011级计算机科学与技术完成学生:2011180021 郭姗 指导教师:阮晓龙 完成日期:201X 年06 月22 日 目录 1. 课程设计题目概述3 2. 研究内容与目的4 3. 研究方法5 4. 研究报告6 5. 测试报告/实验报告7 6. 课题研究结论8 7. 总结9

1、课程设计题目概述 随着Linux系统的逐渐推广,它被越来越多的计算机用户所了解和应用. Linux是一个多任务的操作系统,也就是说,在同一个时间内,可以有多个进程同时执行。如果读者对计算机硬件体系有一定了解的话,会知道我们大家常用的单CPU计算机实际上在一个时间片断内只能执行一条指令,那么Linux是如何实现多进程同时执行的呢?原来Linux使用了一种称为"进程调度(process scheduling)"的手段,首先,为每个进程指派一定的运行时间,这个时间通常很短,短到以毫秒为单位,然后依照某种规则,从众多进程中挑选一个投入运行,其他的进程暂时等待,当正在运行的那个进程时间耗尽,或执行完毕退出,或因某种原因暂停,Linux就会重新进行调度,挑选下一个进程投入运行。因为每个进程占用的时间片都很短,在我们使用者的角度来看,就好像多个进程同时运行一样了。本文就是对进程调度进行研究、实验的。 本文首先对Linux系统进行了简要的介绍, 然后介绍了进程管理的相关理论知识。其次,又介绍最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)、先来先服务算法的相关知识,并对进程调度进行最高优先数优先的调度算法和先来先服务算法模拟实验,并对比分析两种算法的优缺点,从而加深对进程概念和进程调度过程/算法的理解 设计目的:在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择某一进程占用处理机。使得系统中的进程能够有条不紊的运行,同时提高处理机的利用率以及系统的性能。所以设计模拟进程调度算法(最高优先数优先的调度算法、先来先服务算法),以巩固和加深处理进程的概念,并且分析这两种算法的优缺点。关键词:linux 进程调度调度算法

Linux 进程管理实验

Linux 进程管理实验 一、实验内容: 1. 利用bochs观测linux0.11下的PCB进程控制结构。 2. 利用bochs观测linux0.11下的fork.c源代码文件,简单分析其中的重要函数。 3. 在fork.c适当位置添加代码,以验证fork函数的工作原理。 二、Linux进程管理机制分析 Linux有两类进程:一类是普通用户进程,一类是系统进程,它既可以在用户空间运行,又可以通过系统调用进入内核空间,并在内核空间运行;另一类叫做内核进程,这种进程只能在内核空间运行。在以i386为平台的Linux系统中,进程由进程控制块,系统堆栈,用户堆栈,程序代码及数据段组成。Linux系统中的每一个用户进程有两个堆栈:一个叫做用户堆栈,它是进程运行在用户空间时使用的堆栈;另一个叫做系统堆栈,它是用户进程运行在系统空间时使用的堆栈。 1.Linux进程的状态: Linux进程用进程控制块的state域记录了进程的当前状态,一个Linux 进程在它的生存期中,可以有下面6种状态。 1.就绪状态(TASK_RUNNING):在此状态下,进程已挂入就绪队列,进入准备运行状态。 2.运行状态(TASK_RUNNING):当进程正在运行时,它的state域中的值不改变。但是Linux会用一个专门指针(current)指向当前运行的

任务。 3.可中断等待状态(TASK_INTERRUPTIBLE):进程由于未获得它所申请的资源而处在等待状态。不管是资源有效或者中断唤醒信号都能使等待的进程脱离等待而进入就绪状态。即”浅睡眠状态”。 4.不可中断等待状态(TASK_UNINTERRUPTIBLE):这个等待状态与上面等待状态的区别在于只有当它申请的资源有效时才能被唤醒,而其它信号不能。即“深睡眠状态”。 5.停止状态(TASK_STOPPED):当进程收到一个SIGSTOP信号后就由运行状态进入停止状态,当收到一个SINCONT信号时,又会恢复运行状态。挂起状态。 6.终止状态(TASK_ZOMBIE):进程因某种原因终止运行,但进程控制块尚未注销。即“僵死状态”。 状态图如下所示: 2.Linux进程控制块:

Linux基础操作练习题

Linux基础操作练习题 姓名:古慧班级:09软件学号:20090300430117 二、问答题 1.使用什么命令在Linux文件系统的不同目录之间切换,如何显示当前所有的目录? 答:在Linux文件系统的不同目录之间切换的命令是cd, 显示当前所有的目录的命令是pwd。 2.使用什么命令列出当前目录中的文件和子目录名? 答:使用ls 命令将列出当前目录中的文件和子目录名。 使用dir或vdir命令也可以列出目录中的文件清单。使用上与ls命令类似。 3.使用什么命令把两个文件合并成一个文件? 答:cat命令可用来进行文件的合并、建立、覆盖或者添加内容等操作。 4.有哪些命令可用来查看文件的内容,这些命令有什么不同? 答:cat命令用来把文件内容显示到屏幕上,还用来进行文件的合并、建立、覆盖或者添加内容等操作。 more命令可以在浏览文件的时候前后翻页,在阅读长文本时特别有用。 less命令比more命令功能更强,是许多程序(比如man命令等)使用的缺省的阅读命令。less 的输出结果可以向前或向后翻页,但是 more 仅能向前 翻页。 head和tail命令用来阅读文件的开头或者结尾的部分。加上参数-n x 可以指定查看x 行。 5.新建、移动、删除和复制文件使用什么命令? 答:Cat、touch命令可用来建立文件。 rm命令可以用来删除文件和目录。 mv命令用于文件改名,也可以用来在文件系统内移动文件或者子目录。 cp命令用来对文件进行复制操作。 6. 新建、移动、删除和复制目录使用什么命令? 答:mkdir命令用于建立子目录。此命令可以一次建立多个子目录。 mv命令用于文件改名,也可以用来在文件系统内移动文件或者子目录。 rm命令可以用来删除文件和目录。 rmdir命令用来删除空子目录。 cp命令用来对子目录进行复制操作。 7.使用什么命令统计文件中的信息? 答:命令file用来确定文件的类型。使用此命令时,可以指定一个或多个文件名。 wc命令可以统计指定文件中的字节数、字数、行数, 并将统计结果显示在屏幕上。 8.标准输入和标准输出指什么?输出重定向和输入重定向指什么? 答:标准输入文件(stdin),通常对应终端的键盘; 标准输出文件(stdout),这个文件都对应终端的屏幕。 进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

linux进程管理篇

目录:(内容较多,加个目录) |-进程管理 进程常用命令 |- w查看当前系统信息 |- ps进程查看命令 |- kill终止进程 |- 一个存放内存中的特殊目录/proc |- 进程的优先级 |- 进程的挂起与恢复 |- 通过top命令查看进程 计划任务 |- 计划任务的重要性 |- 一次性计划at和batch |- 周期性计划crontab 进程管理的概念 进程和程序区别 1.程序是静态概念,本身作为一种软件资源长期保存;而进程是程序的执行过程,它是动态概念,有一定的生命期,是动态产生和消亡的。 2.程序和进程无一一对应关系。一个程序可以由多个时程公用;另一一方面,一个进程在活动中有可顺序地执行若干个程序 父子进程的关系 1.子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程 2.在linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。 3.父进程终止子进程自然终止。 前台进程和后台进程 前台进程 在shell提示处理打入命令后,创建一个子进程,运行命令,Shell等待命令退出,然后返回到对用户给出提示符。这条命令与Shell异步运行,即在前台运行,用户在它完成之前不能执行别一个命令

很简单,我们在执行这个查找命令时,无法进行其它操作,这个查找就属于前台进程 后台进程 在Shell提示处打入命令,若后随一个&,Shell创建子进程运行此命令,但不等待命令退出,而直接返回到对用户给出提示。这条命令与Shell同步运行,即在后台运行。“后台进程必须是非交互式的” 再来看这个命令就变成了后台进程,我们用同样的条件进行查找,把查找记过放到hzh/test/init.find这个文件中。不影响我们前台其它的操作。 进程的状态

红帽linux常用操作命令

红帽linux常用操作命令 1.查看硬件信息 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量资源 # free -m # 查看内存使用量和交换区使用量# df -h # 查看各分区使用情况 # du -sh # 查看指定目录的大小 # grep MemTotal /proc/meminfo # 查看内存总量 # grep MemFree /proc/meminfo # 查看空闲内存量 # uptime # 查看系统运行时间、用户数、负载# cat /proc/loadavg # 查看系统负载磁盘和分区 # mount | column -t # 查看挂接的分区状态 # fdisk -l # 查看所有分区 # swapon -s # 查看所有交换分区 # hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备) # dmesg | grep IDE # 查看启动时IDE设备检测状况网络# ifconfig # 查看所有网络接口的属性 # iptables -L # 查看防火墙设置 # route -n # 查看路由表 # netstat -lntp # 查看所有监听端口 # netstat -antp # 查看所有已经建立的连接 # netstat -s # 查看网络统计信息进程

Linux课程设计进程控制

课程设计报告 课程名称Linux操作系统课程设计 指导教师张玲 起止日期2014-03-01 至2014-06-13 实验项目实验二进程控制 学院信息与通信工程学院 专业电子信息工程 学生姓名 班级/学号 成绩 指导老师签字

1. 课程设计概述 本次课设意在利用进程控制相关的系统调用编程进行进程控制实验,观察进程从创建、运行到终止的控制过程,加深对进程概念的理解。 1.1 课程设计的目的 本实验的目的是掌握进程的概念,理解进程的创建、执行、等待、终止的过程。熟悉有关进程控制的命令和系统调用,理解Shell 的工作原理。 1.2 课程设计的内容 1) 进程控制命令 ● 使用进程控制命令ps ,kill 监视和控制进程的活动 2) 编程部分 ● 用fork ,wait ,exec 系统调用编程实现进程控制; ● 编写一个简单的shell 。 1.3 设计原理 进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。 构建的文件构架如图: 图1 实验目录树的结构 2012010948 exp2 exp1 exp3 vis vis2

2.实验步骤 2.1操作 2.1.1进程控制命令(在此终端窗口的操作截图见图1) 1.执行ps命令,查看bash进程的PID: PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID。进程中止后PID被系统回收。 2.在后台运行一个yes进程: yes > /dev/null & 3.用ps -f命令观察yes进程的pid和ppid,用ps u命令观察yes进程的状态。 yes进程的父进程是哪个进程?通过查看yes程序的PPID可知其父进程为bash 4.根据命令名搜索特定的进程: ps-ef|grep yes: 5.用kill命令杀掉yes进程: kill 【PID】: 图1 进程控制命令

Linux 进程的启动方式

Linux 进程的启动方式 程序或者命令的执行实际上是通过进程实现的。通常情况下,程序或者命令是保存在硬盘上的,当在命令行中输入一个可执行程序的文件名或者命令并按下Enter 键后,系统内核就将该程序或者命令的相关代码加载到内存中开始执行。 系统会为该程序或者命令创建一个或者多个相关的进程,通过进程完成特定的任务。启动进程的方式有两种,分别为前台启动方式和后台启动方式。 1.以前台方式启动进程 在终端窗口的命令行上输入一个Linux命令并按Enter键,以前台方式启动了一个进程。例如,在终端窗口上执行“find /-name myfile.txt”命令,就可以以前台的方式启动一个进程。而在该进程还未执行完时,可按下Ctrl+z组合键将该进程暂时挂起。然后,可以使用ps命令查看该进程的有关信息,如图41所示。 图41 前台方式启动进程 2.以后台方式启动进程 在前台运行的进程是正在进行交互操作的进程,它可以从标准输入设备接收输入,并将输出结果送到标准输出设备,在同一时刻只能有一个进程在前台运行。而在后台运行的进程一般不需要进行交互操作,不接收终端的输入。 通常情况下,可以让一些运行时间较长而且不接受终端输入的程序以后台方式运行,让操作系统调度它。 要在命令行上以后台方式启动进程,需要在执行的命令后添加一个“&”。例如,在终端窗口的命令行上输入命令“find / -name myfile2.txt &”并按下Enter键后将从后台启动一个进程。启动后,系统会显示如下所示的信息: 这里的数字2表示该进程是运行于后台的第2个进程,数字3516是该进程的PID(即进程标识码,用于惟一地标识一个进程)。 然后,出现了shell提示符,这表示已返回到前台。这时,执行ps命令将能够看到现在在系统中有两个由find命令引起的进程,它们的标识号是不同的,因而是两个不同的进程,其中,PID为3385的进程就是刚才被挂起的进程。 如果执行jobs命令可以查看当前控制台中的后台进程,可以看到当前在后台有两个进程,其中一个处于运行(Running)状态,另一个,即被挂起的进程处于停止

linux基础操作

玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了。当然你也可以在使用时去找一下man,他会帮你解决不少的问题。然而每个人玩Linux的目的都不同,所以他们常用的命令也就差异非常大,而我主要是用Linux进行C/C++和shell程序编写的,所以常用到的命令可以就会跟一个管理Linux系统的人有所不同。因为不想在使用是总是东查西找,所以在此总结一下,方便一下以后的查看。不多说,下面就说说我最常用的Linux 命令。 1、cd命令 这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。如: [plain]view plain copy print? 1.cd /root/Docements # 切换到目录/root/Docements 2.cd ./path # 切换到当前目录下的path目录中,?.?表示当前目录 3.cd ../path # 切换到上层目录中的path目录中,?..?表示上一层目录 2、ls命令 这是一个非常有用的查看文件与目录的命令,list之意,它的参数非常多,下面就列出一些我常用的参数吧,如下: [plain]view plain copy print? 1.-l :列出长数据串,包含文件的属性与权限数据等 2.-a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用) 3.-d :仅列出目录本身,而不是列出目录的文件数据 4.-h :将文件容量以较易读的方式(GB,kB等)列出来 5.-R :连同子目录的内容一起列出(递归列出),等于该目录下的所有文件都会显示出来 注:这些参数也可以组合使用,下面举两个例子: [plain]view plain copy print? 1.ls -l #以长数据串的形式列出当前目录下的数据文件和目录 2.ls -lR #以长数据串的形式列出当前目录下的所有文件 3、grep命令 该命令常用于分析一行的信息,若当中有我们所需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工等等,它的简单语法为 [plain]view plain copy print? 1.grep [-acinv] [--color=auto] '查找字符串' filename 它的常用参数如下: [plain]view plain copy print?

linux基本操作、

实验三 沈建成学号:22 11.复制文件profile到一个新文件profile.bak,作为备份 12.用ls命令以长格式列出当前目录下的所有文件,注意比较每个文件的长度和创建时间的不同。 13.用less命令分屏查看文件xinetd.cinf的内容,注意练习less命令的各个子命令,例如b、p、q等并对then关键字查找 14.用grep命令在xinetd.cinf文件中对关键字y进行查询,并与上面的结果比较

15.给文件profile创建一个符号链接lnprofile和一个硬链接lnprofile1 16长格式显示文件profile、lnsprofile和lnhprofile的详细信息,比较文件lnhprofile的链接数的变化。 17.用less命令查看lnprofile和lnprofile1的内容。看看有什么结果 18.删除文件lnsprofile,显示当前目录下的文件列表,回到上层目录。 19.用tar命令把目录sjc打包。

20.用gzip命令把打好的包进行压缩。 21.把sjc.tar.gz改名为backup.tar.gz 22.显示当前目录下的文件和目录表,确认是否成功 23进入test目录,显示目录中的文件列表 24.把文件sjc.tar.gz解包 25.显示当前目录下的文件和目录列表,复制sjc目录为testbak目录作为备份 26.查找root用户自己的主目录下的所有名为newfile的文件 27.删除test目录和其下所有文件 二、查找操作命令的使用 1.查找ls命令所在的位置 2.查找ls命令的手册位置 3. 在当前目录下查找普通文件,并以长格式显示

实验一Linux操作系统基础

实验一 1 实验名称:Linux操作系统基础 2 实验目标 2.1 掌握安装Linux操作系统的方法。 2.2 掌握Linux操作系统的基本配置。 2.3 了解GNOME桌面环境。 2.4灵活掌握基本shell命令的使用。 3 实验准备 3.1 下载VMware Workstation虚拟机软件(版本不限)。 3.2 准备Linux操作系统的安装源(核版本和发行版本均不限)。 注:实验准备、实验容4.1和4.2作为回家作业布置,同学们利用课余时间完成。 4 实验要求、步骤及结果 4.1 安装虚拟机软件。 【操作要求】安装VMware Workstation虚拟机软件,版本不限,并填写以下容。 4.1.1安装VMware Workstation虚拟机软件的环境(操作系统)

4.1.2VMware Workstation虚拟机版本号

4.2 安装Linux操作系统。 【操作要求】在VMware虚拟机下安装Linux操作系统,版本不限,并填写以下容。 4.2.1 Linux发行版本: 4.2.2 Linux核版本: 4.2.3 Linux操作系统的主要配置参数 4.3 了解Linux操作系统的桌 面环境之一GNOME。 【操作要求1】打开图形化用 户界面、查看桌面图标,查看 主菜单,查看个人用户主目录 等使用环境。

【操作要求2】启动字符终端2,了解命令提示行含义。 Alt+F2+Ctrl [用户名主机名目录名] 提示符 【操作要求3】注销字符终端2 【操作要求4】关闭图形化用户界面,关闭Linux操作系统。 4.4 掌握基本shell命令的使用。 注:以下需要截取shell命令与结果,没有结果截到下一命令提示行。 【操作要求1】用超级用户登陆;将主机名改为具有个人学号后3位特征的名称,退出虚拟终端后重新登录;查看当前目录的绝对路径。 【操作步骤-登陆】 【操作步骤-修改主机名】

相关主题
文本预览
相关文档 最新文档