ZKX's LAB

C语言如何创建并发进程 建立进程控制块函数c语言

2020-08-11知识13

用C语言编程模拟处理机调度(实现一种算法) #includeincludedefine getpch(type)(type*)malloc(sizeof(type))define NULL 0struct pcb {/*定义进程控制块PCB*/char name[10];char state;int super;int ntime;int rtime;struct pcb*link;}*ready=NULL,*p;typedef struct pcb PCB;void sort()/*建立对进程进行优先级排列函数*/{PCB*first,*second;int insert=0;if((ready=NULL)|((p->;super)>;(ready->;super)))/*优先级最大者,插入队首*/{p->;link=ready;ready=p;}else/*进程比较优先级,插入适当的位置中*/{first=ready;second=first->;link;while(second。NULL){if((p->;super)>;(second->;super))/*若插入进程比当前进程优先数大,*/{/*插入到当前进程前面*/p->;link=second;first->;link=p;second=NULL;insert=1;}else/*插入进程优先数最低,则插入到队尾*/{first=first->;link;second=second->;link;}}if(insert=0)first->;link=p;}}void input()/*建立进程控制块函数*/{int i,num;system(\"cls\");清屏*/printf(\"\\n 请输入进程数:\");scanf(\"%d\",&num);for(i=1;i;i+){printf(\"\\n 进程号No.%d:\\n\",i);p=getpch(PCB);printf(\"\\n 输入进程名:\");scanf(\"%s\",p->;name);printf(\"\\n 输入进程优先数:\");。C语言有什么函数可以判断某进程是否存在 C语言没有库函数可以做到这一点。但是在Linux下,有一些替代方案。见下:基本思路是先定义一个FILE指针,用该指针接收popen()执行ps指令的返回值,再从指针中读取数据到缓存,根据得到的数据判断进程是否存在,怎么操作要看ps的参数了。includeincludeincludeincludeincludeincludeincludedefine BUFSZ PIPE_BUFvoid err_quit(char*msg){perror(msg);exit(EXIT_FAILURE);}int main(int argc,char*argv[]){FILE*fp;int count;char buf[BUFSZ];char command[150];if(argc。2){printf(\"USAGE:example<;process name>;\\n\");exit(EXIT_SUCCESS);}elsesprintf(command,\"ps-C%s|wc-l\",argv[1]);if((fp=popen(command,\"r\"))=NULL)err_quit(\"popen\");if((fgets(buf,BUFSZ,fp))。NULL){count=atoi(buf);if((count-1)=0)printf(\"%s not found\\n\",argv[1]);elseprintf(\"process:%s total is%d\\n\",argv[1],(count-1));}pclose(fp);exit(EXIT_SUCCESS);}C语言创建进程 fork()应该是Linux操作系统的函数。从#include和fork()上判断,这个程序应该是Linux操作系统的应用程序。Windows上应该用CreateProcess创建进程获取进程ID用DWORD GetWindowThreadProcessld(HWND hwnd,LPDWORD lpdwProcessld)hWnd:窗口句柄。lpdwProcessld:接收进程标识的32位值的地址。如果这个参数不为NULL,GetWindwThreadProcessld将进程标识拷贝到这个32位值中,否则不拷贝。返回值:返回值为创建窗口的线程标识。求: 用c语言实现进程控制的源码 pipe.c 程序清单*/includeincludeincludeincludemain(){pid_t pid;进程名为pid*/int fds1[2],fds2[2],i=0,j=0;char buf1[50],buf2[50],buf3[50],buf4[50];创建四个缓冲区*/pipe(fds1);创建管道1*/pipe(fds2);创建管道2*/if((pid=fork()))/*进程创建失败,调用退出函数*/{printf(\"\\n*fork error \\n\");exit(1);}else if(pid=0)/*创建的是父进程*/{while(1){sprintf(buf1,\"%d child process print。rand());把字符串child process print。写道缓冲区1 中,rand是随机数产生器*/write(fds1[1],buf1,50);把buf1中的信息写道管道1中*/read(fds2[0],buf2,50);从管道2中读取信息到buf2中*/i=(int)buf2[0]%10;sleep(i);睡1~10中随机的一个秒数*/printf(\"%s,%d sleeping%d/n\",buf2,getpid(),i);}}else/*创建的是子进程*/{while(1){read(fds1[0],buf3,50);从管道1中读取信息到buf3中*/j=(int)buf3[0]%10;printf(\"%s,%d sleeping%d/n\",buf3,getpid(),j);sleep(j);睡1~10中随机的一个秒数*/sprintf(buf4,\"%d Parent process print。rand());把字符串child process print。写道缓冲区4中,rand是随机数产生器*/write(fds2[1],buf4,50);把buf4中的信息写道管道2中*/。Linux系统是如何创建进程的?听说这一过程是用C语言clone函数实现的? 谢邀。我之前两节文章简要地从C语言源代码层面讨论了Linux系统中进程的基本概念,我们知道了Linux内核如何描述和记录进程的资源,以及进程的五种基本状态和进程的家族树。事实上,就进程管理而言,Linux还是有一些独特之处的。Linux 系统中的进程创建许多操作系统都提供了专门的进程产生机制,比较典型的过程是:首先在内存新的地址空间里创建进程,然后读取可执行程序,装载到内存中执行。Linux 系统创建线程并未使用上述经典过程,而是将创建过程拆分到两组独立的函数中执行:fork()函数和 exec()函数族。基本流程是这样的:首先,fork()函数拷贝当前进程创建子进程。产生的子进程与父进程的区别仅在与 PID 与 PPID 以及某些资源和统计量,例如挂起的信号等。准备好进程运行的地址空间后,exec()函数族负责读取可执行程序,并将其加载到相应的位置开始执行。Linux 系统创建进程使用的这两组函数效果与其他操作系统的经典进程创建方式效果是相似的,可能有读者会觉得这么做会让进程创建过于繁琐,其实不是的,Linux 这么做的其中一个原因是为了提高代码的复用率,这得益于 Linux 高度概括的抽象,无需再额外设计一套机制用于创建进程。“写时拷贝”早期 Linux 中的 fork()。C语言创建进程? 1.创建进程不是一定需要exe。2.不能单独只调用exe的一个函数,3.被编译成dll的程序可以被单独调用一个函数,4.你自己写的程序可以用命令行参数控制来控制它如何执行,或者通过进程间通信控制它如何执行。Linux系统是如何创建进程的?听说这一过程是用C语言clone函数实现的? 这跟execvp函数的实现方式有关:int execvp(const char*file,char*const argv[]);execvp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。之所以显示“fail to exec”,是因为在PATH环境变量所指的目录中没有名为“hello”的程序。建议进行如下操作:1、运行“echo$PATH”,查看一下PATH环境变量指向那些目录2、编写一个输出“hello world”的程序,并命名为hello,即执行命令:gcc-o hellohello.c3、把名为”hello“的程序拷贝到PATH变量所指的其中一个目录中C语言用什么语句终止整个程序? C语言用exit()语句可2113以终止整个程序。5261C语言中,exit()通常是用在子程序中用来终结4102程序用的,使用后程序自动结1653束,跳回操作系统。exit(0)表示程序正常退出;exit(1)、exit(-1)表示程序异常退出。在整个程序中,只要调用exit,就会结束程序。exit()函数所在的头文件是stdlib.h,需要将该头文件引入后使用。扩展资料:exit()函数内部实际操作过程:1、调用atexit()注册的函数(出口函数),按ATEXIT注册时相反的顺序调用所有由它注册的函数,这使得我们可以指定在程序终止时执行自己的清理动作.例如,保存程序状态信息于某个文件,解开对共享数据库上的锁等.2、调用cleanup()来关闭所有打开的流,这将导致写所有被缓冲的输出,删除用TMPFILE函数建立的所有临时文件.3、最后调用_exit()函数终止进程。参考资料来源:-Exit()C语言创建进程 fork()应该是Linux操作系统的函数。从#include和fork()上判断,这个程序应该是Linux操作系统的应用程序。Windows上应该用CreateProcess创建进程 获取进程ID用 DWORD 。C语言如何创建并发进程 WIN32API函数CreateProcess用来创2113建一个新的进程和它的主线5261程,这个新进程运行指定4102的可执行文件。函数原型:1653BOOL CreateProcessLPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes。LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATIONlpProcessInformation参数:lpApplicationName指向一个NULL结尾的、用来指定可执行模块的字符串。这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine 参数最前面并由空格符与后面的字符分开。lpCommandLine指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被。

#进程控制块#c语言#进程间通信#进程调度#c语言函数

qrcode
访问手机版