用C语言在新控制台启动新进程

tyytzy 2010-05-19 01:25:13
做毕业设计时遇到一个问题,望csdn上的大侠们可以指点一二,详细描述如下:
用C语言在linux下或windows下调用system或exec函数启动一个新的进程,我想这个新启动的进程在一个新的控制台中运行,原来的父进程还在原来的控制台中运行,请问这个想法如何实现!

望各位大侠不吝赐教,先跪谢了!
...全文
405 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tyytzy 2010-05-19
  • 打赏
  • 举报
回复
非常感谢(瞌睡虫·星辰)的回答,不过你说的都在 windows下的一些系统函数调用,我的本意是说在利用system,exec函数族,WinExec, ShellExecute,CreateProcess 这些都是windows系统的一些api函数,在linux下无法使用,或许是我没有说清楚,实在是抱歉!我的程序是在linux下跑的,能不能只用system或execl之类的函数实现的我的要求。另外system和execl函数调用的程序在执行时需要传入参数的。


最后,再次感谢(瞌睡虫·星辰)的回答。。。
cattycat 2010-05-19
  • 打赏
  • 举报
回复
可以结贴了,分给星辰吧。
jixingzhong 2010-05-19
  • 打赏
  • 举报
回复
当然,更简单的办法就是system函数,这个是标准库函数,可通用

函数名称: system
函数原型: int system(const char *command)
函数功能: 调用DOS命令
函数返回:
参数说明:
所属文件: <stdlib.h>

#include <stdlib.h>
#include <stdio.h>
int main()
{
system("dir");
return 0;
}



另外,可参考:
函数名称: spawnl、spawnle、spawnlp、spawnlpe、spawnv、spawnve、spawnvp、spawnvpe
函数原型: int spawnl(int mode, char *path, char *arg 0, … )
int spawnle(int mode, char *path, char *arg0, … )
int spawnlp(int mode, char *path, char *arg0, … )
int spawnlpe(int mode, char *path, char *arg0, … )
int spawnv(int mode, char *path, char *argv[])
int spawnve(int mode, char *path, char *argv[], char **env)
int spawnvp(int mode, char *path, char *argv[])
int spawnvpe(int mode, char *path, char *argv[], char **env)
函数功能: 在一个程序中调用另外一个程序
函数返回: -1:调用失败,0:调用成功
参数说明: path-被调用程序路径,arg-调用的参数,mode-调用模式,具体如下:
P_WAIT 0 将父过程挂起,直到子过程执行完毕
P_NOWAIT 1 父子过程同时执行,Turboc不支持
P_OVERLAY 2 子过程覆盖父过程
所属文件: <process.h>

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

int main()
{
int process_id;
#if defined(__OS2__)||defined(__NT__)
int status, rc;
#endif

process_id=spawnl(P_NOWAIT,"child.exe","child","5",NULL);
if(process_id==-1){
printf("spawn failed-%s\n",strerror(errno));
exit(EXIT_FAILURE);
}
printf("Process id=%d\n",process_id);

#if defined(__OS2__)||defined(__NT__)
rc=cwait(&status,process_id,WAIT_CHILD);
if(rc==-1){
printf("wait failed-%s\n",strerror(errno));
}else{
printf("wait succeeded-%x\n",status);
switch(status&0xff){
case 0:
printf("Normal termination code=%d\n",status>>8);
break;
case 1:
printf("Hard-error abort\n");
break;
case 2:
printf("Trap operation\n");
break;
case 3:
printf("SIGTERM signal not intercepted\n");
break;
default:
printf("Bogus return status\n");
}
}
#endif
printf("spawn completed\n");
return 0;
}

/*
[child.c]
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>

int main(int argc,char *argv[])
{
int delay;
if(argc<=1)
exit(EXIT_FAILURE);
delay=atoi(argv[1]);
printf("I am a child going to sleep for %d seconds\n",delay);
sleep(delay);
printf("I am a child awakening\n");
exit(123);
return 0;
}
*/
jixingzhong 2010-05-19
  • 打赏
  • 举报
回复
WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
WinExec 两个参数,前一个指定路径,后一个指定显示方式。
ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。

三个SDK函数( WinExec、ShellExec、CrateProcess )的语法:


WinExec

这个函数最简单,只有两个参数,原型如下:


UINT WinExec(

LPCSTR lpCmdLine, // 命令路径

UINT uCmdShow // 显示方式

;

使用方法如下:

WinExec("Notepad.exe", SW_SHOW); // 打开记事本
WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe
需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如Neterm,Calc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。


ShellExecute

原型如下:

HINSTANCE ShellExecute(

HWND hwnd, //父窗口句柄

LPCTSTR lpOperation, //操作, 打开方式 "edit","explore","open","find","print","NULL"

LPCTSTR lpFile, //文件名,前面可加路径

LPCTSTR lpParameters, //参数

LPCTSTR lpDirectory, //默认文件夹

INT nShowCmd //显示方式

);

使用方法如下:

ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL); // 打开C:\Test.txt 文件
ShellExecute(NULL, "open", "http://www.google.com",/ NULL, NULL, SW_SHOWNORMAL); // 打开网页www.google.com
ShellExecute(NULL,"explore", "D:\\C++",NULL,NULL,SW_SHOWNORMAL); // 打开目录D:\C++
ShellExecute(NULL,"print","C:\\Test.txt",NULL,NULL, SW_HIDE); // 打印文件C:\Test.txt
ShellExecute不支持定向输出。


CreateProcess

原型如下:

BOOL CreateProcess(

LPCTSTR lpApplicationName, //执行程序名

LPTSTR lpCommandLine, // 参数行

//下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性

LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes

LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes

BOOL bInheritHandles, // 继承标志

DWORD dwCreationFlags, // 创建标志

LPVOID lpEnvironment, // 环境变量

LPCTSTR lpCurrentDirectory, // 运行该进程的初始目录

LPSTARTUPINFO lpStartupInfo, // 用于在创建子进程时设置各种属性

LPPROCESS_INFORMATION lpProcessInformation //用于在进程创建后接受相关信息

;

使用方法如下:
PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
si.wShowWindow=SW_SHOW;
si.dwFlags=STARTF_USESHOWWINDOW;
bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);


可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!





关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项:

1、定义头文件

在头文件stdafx.h中必须定义以下两个头文件:

#include <shlobj.h> // 可替换为 windows.h
#include <shellapi.h>
如果定义了头文件 #include <windows.h>的话就不必定义 #include <shlobj.h>了,"windows.h" 不光是包含了"shellapi.h",它还定义了许多数据类型,如果没有这些数据类型,shellapi.h本身会出错。

2、定义路径

C++中所表示的路径要用 " \\ "而不是平常所用的" \ ",所以以上三个函数表示路径都为:

Disk:\\Directory\\...\\File name

WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED);

ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL);
bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
jixingzhong 2010-05-19
  • 打赏
  • 举报
回复
win下可以使用WinExec、ShellExecute和CreateProcess
sanguomi 2010-05-19
  • 打赏
  • 举报
回复
handle h = ::CreateProcess(.....);
waitforsingle(h, );
然后退出
赵4老师 2010-05-19
  • 打赏
  • 举报
回复
Windows下,system("cmd.exe /k ping.exe 127.0.0.1");
bitterness 2010-05-19
  • 打赏
  • 举报
回复
他要的是 “新的控制台”
chaoliu1024 2010-05-19
  • 打赏
  • 举报
回复
楼主百度下system()函数的用法...linux下我没用过,不好回答 不好意思
chaoliu1024 2010-05-19
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
system("notepad.exe"); // 用system函数打开记事本

return 0;
}
huanmie_09 2010-05-19
  • 打赏
  • 举报
回复
楼主可以查一下fork函数创建子进程方面的知识。
在创建的子进程里调用execl之类的函数,执行命令.
实验二 进程管理   Windows所创建的每个进程都从调用CreateProcess() API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用ExitProcess() 或TerminateProcess() API函数终止。通常应用程序的框架负责调用 ExitProcess() 函数。对于C++ 运行库来说,这一调用发生在应用程序的main() 函数返回之后。 1. 创建进程 CreateProcess() 调用的核心参数是可执行文件运行时的文件名及其命令行。表 2-1详细地列出了每个参数的类型和名称。   表2-1 CreateProcess() 函数的参数 参数名称 使用目的 LPCTSTR lpApplivationName 全部或部分地指明包括可执行代码的EXE文件的文件名 LPCTSTR lpCommandLine 向可执行文件发送的参数 LPSECURIITY_ATTRIBUTES lpProcessAttributes 返回进程句柄的安全属性。主要指明这一句柄是否应该由其他子进程所继承 LPSECURIITY_ATTRIBUTES lpThreadAttributes 返回进程的主线程的句柄的安全属性 BOOL bInheritHandle 一种标志,告诉系统允许进程继承创建者进程的句柄 DWORD dwCreationFlage 特殊的创建标志 (如CREATE_SUSPENDED) 的位标记 LPVOID lpEnvironment 向进程发送的一套环境变量;如为null值则发送调用者环境 LPCTSTR lpCurrentDirectory 进程启动目录 STARTUPINFO lpStartupInfo STARTUPINFO结构,包括进程的输入和输出配置的详情 LPPROCESS_INFORMATION lpProcessInformation 调用的结果块;发送应用程序的进程和主线程的句柄和ID   可以指定第一个参数,即应用程序的名称,其中包括相对于当前进程的当前目录的全路径或者利用搜索方法找到的路径;lpCommandLine参数允许调用者向应用程序发送数据;接下来的三个参数与进程和它的主线程以及返回的指向该对象的句柄的安全性有关。 然后是标志参数,用以在dwCreationFlags参数中指明系统应该给予进程什么行为。经常使用的标志是CREATE_SUSPNDED,告诉主线程立刻暂停。当准备好时,应该使用ResumeThread() API来启动进程。另一个常用的标志是CREATE_NEW_CONSOLE,告诉进程启动自己的控制台窗口,而不是利用父窗口。这一参数还允许设置进程的优先级,用以向系统指明,相对于系统中所有其他的活动进程来说,给此进程多少CPU时间。 接着是CreateProcess() 函数调用所需要的三个通常使用缺省值的参数。第一个参数是lpEnvironment参数,指明为进程提供的环境;第二个参数是lpCurrentDirectory,可用于向主创进程发送与缺省目录不同的进程使用的特殊的当前目录;第三个参数是STARTUPINFO数据结构所必需的,用于在必要时指明应用程序的主窗口的外观。 CreateProcess() 的最后一个参数是用于进程对象及其主线程的句柄和ID的返回值缓冲区。以PROCESS_INFORMATION结构中返回的句柄调用CloseHandle() API函数是重要的,因为如果不将这些句柄关闭的话,有可能危及主创进程终止之前的任何未释放的资源。 2. 正在运行的进程 如果一个进程拥有至少一个执行线程,则为正在系统中运行的进程。通常,这种进程使用主线程来指示它的存在。当主线程结束时,调用ExitProcess() API函数,通知系统终止它所拥有的所有正在运行、准备运行或正在挂起的其他线程。当进程正在运行时,可以查看它的许多特性,其中少数特性也允许加以修改。 首先可查看的进程特性是系统进程标识符 (PID) ,可利用GetCurrentProcessId() API函数来查看,与GetCurrentProcess() 相似,对该函数的调用不能失败,但返回的PID在整个系统中都可使用。其他的可显示当前进程信息的API函数还有GetStartupInfo()和GetProcessShutdownParameters() ,可给出进程存活期内的配置详情。 通常,一个进程需要它的运行期环境的信息。例如API函数GetModuleFileName() 和GetCommandLine() ,可以给出用在CreateProcess() 中的参数以启动应用程序。在创建应用程序时可使用的另一个

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧