linux下的system函数问题!!!!!

shiter
人工智能领域优质创作者
博客专家认证
2013-07-26 09:52:52
有个可执行程序hello
命令行里面输入./hello就能执行了
但是我想在程序里面调用,想要用system函数,咋办〉
hello在 /season/中文 这个目录里面
怎么搞?
...全文
233 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiter 2013-07-30
  • 打赏
  • 举报
回复
引用 23 楼 ForestDB 的回复:
错了,是 "/bin/ls /"这样的

//下面是建立连接,调用函数,初始化上传运行文件类
case COMMAND_MANAGER_UPLOAD:
            {
                mdk::Socket sock;
                sock.Init( mdk::Socket::tcp );
                if ( sock.Connect( m_lpszMasterHost,m_nMasterPort ) )
                {
                    SOCKET_HWIND sockwind;
                    sockwind.pClient = sock;
                    sockwind.hWind = cmd.hwnd;
                    pid_t pid;
                    int status;
                    if((pid = vfork())<0)//使用vfork保证首先进入子进程
                    {
                        exit(0);
                    }
                    else if(pid ==0)
                    {
                        my_cmd_id = getpid();
                        OnUploadManager((void *)&sockwind);
                    }
                    else
                    {
                       
                    }
                    
                    waitpid(my_cmd_id, &status, 0);
                }
                break;
            }


void *OnUploadManager( void *parm )//文件上传,全局函数
{
    
    SOCKET_HWIND *sockwind = (SOCKET_HWIND*)parm;
	CUploadManager manager(&sockwind->pClient,sockwind->hWind);
    manager.OnReceive();
    
	return 0;
}

class CUploadManager:public CManager
{
public:
    
    mdk::Socket *m_pClient;
    void *m_hWind;
    
    char fileName[MAX_PATH]; //维护一个文件夹的名字
    char Name[MAX_PATH];//文件名,不带路径
    
    
public:
    CUploadManager(mdk::Socket *pClient,void *hWind); 
    void OnReceive();
    int Send(char * lpData, int  nSize);
    
    int WriteFileData(char * buff);//写文件
    
    int RunProgram();//接受完成后,先修改权限,完后运行文件
};

int CUploadManager::RunProgram()
{
    char chmod[MAX_PATH]= {0};
    char programm[MAX_PATH] = {0};
    char tempFileName[MAX_PATH] = {0};
    
    memcpy(tempFileName, fileName, sizeof(tempFileName));
    
   
    sprintf(tempFileName, "%s/%s",tempFileName,Name);
    
    strcpy(chmod, "/bin/chmod 777 ");
    strcat(chmod, tempFileName);  //这里就把整个命令生成了,先改权限,完后运行。
    
    pid_t status;  
    
    
    status = system(chmod);
    
    if (-1 == status)  
    {  
        printf("system error!");  
    }  
    else  
    {  
        printf("exit status value = [0x%x]\n", status);  
        
        if (WIFEXITED(status))  
        {  
            if (0 == WEXITSTATUS(status))  
            {  
                printf("run shell script successfully.\n");  
            }  
            else  
            {  
                printf("run shell script fail, script exit code: %d\n", WEXITSTATUS(status));  
            }  
        }  
        else  
        {  
            printf("exit status = [%d]\n", WEXITSTATUS(status));  
        }  
    }  
    
    
    FILE *read_fp = NULL;  
   // char buffer[BUFSIZ + 1];  
    int chars_read = 0;  
    
   // memset(buffer, 0, sizeof(buffer));  
    read_fp = popen(chmod, "r");  
    
    system(tempFileName);
}


shiter 2013-07-29
  • 打赏
  • 举报
回复
引用 12 楼 max_min_ 的回复:
[quote=引用 9 楼 wangyaninglm 的回复:] [quote=引用 7 楼 buyong 的回复:] system("/season/中文/hello");
这样不能执行把。。。 [/quote] 可以的把!
 #include <stdlib.h>

       int system(const char *command);
system 需要的参数就是一个可执行的命令啊[/quote] 不是执行 得 ./hello的么 但是路径怎么写,比如hell在(/season/中午) 目录下
ForestDB 2013-07-29
  • 打赏
  • 举报
回复
system("/bin/ls");
shiter 2013-07-29
  • 打赏
  • 举报
回复
shiter 2013-07-29
  • 打赏
  • 举报
回复
引用 22 楼 ForestDB 的回复:
try "/bin/ls /:
引用 21 楼 ForestDB 的回复:
应该是缺少PWD这样的环境变量。
怎么办?
ForestDB 2013-07-29
  • 打赏
  • 举报
回复
错了,是 "/bin/ls /"这样的
ForestDB 2013-07-29
  • 打赏
  • 举报
回复
try "/bin/ls /:
ForestDB 2013-07-29
  • 打赏
  • 举报
回复
应该是缺少PWD这样的环境变量。
shiter 2013-07-29
  • 打赏
  • 举报
回复
引用 19 楼 ForestDB 的回复:
man system 实际上是/bin/sh -c command 在这种上下文,环境(environ)不一定有path,所以ls不一定起作用,需要/bin/ls这样的完整的路径。
灰常感谢,加了路径依然返回127,为啥还是不能执行,我就是在vfork新开的进程里面搞的哇。。。
ForestDB 2013-07-29
  • 打赏
  • 举报
回复
man system 实际上是/bin/sh -c command 在这种上下文,环境(environ)不一定有path,所以ls不一定起作用,需要/bin/ls这样的完整的路径。
shiter 2013-07-29
  • 打赏
  • 举报
回复
shiter 2013-07-29
  • 打赏
  • 举报
回复
引用 16 楼 ForestDB 的回复:
system("/bin/ls");


 status = system("ls -al");
    
    if (-1 == status)  
    {  
        printf("system error!");  
    }  
    else  
    {  
        printf("exit status value = [0x%x]\n", status);  
        
        if (WIFEXITED(status))  
        {  
            if (0 == WEXITSTATUS(status))  
            {  
                printf("run shell script successfully.\n");  
            }  
            else  
            {  
                printf("run shell script fail, script exit code: %d\n", WEXITSTATUS(status));  
            }  
        }  
        else  
        {  
            printf("exit status = [%d]\n", WEXITSTATUS(status));  
        }  
    }  
    
返回127,好像是无法执行,为啥同样的代码别的工程光一个main函数就能执行了,但是这个工程里面,我是在新开的进程里面,就不能执行了?
shiter 2013-07-28
  • 打赏
  • 举报
回复
引用 10 楼 buyong 的回复:
[quote=引用 9 楼 wangyaninglm 的回复:] [quote=引用 7 楼 buyong 的回复:] system("/season/中文/hello");
这样不能执行把。。。 [/quote] 我试了能执行[/quote] gcc编译成的可执行文件,可以这样用?
buyong 2013-07-28
  • 打赏
  • 举报
回复
引用 9 楼 wangyaninglm 的回复:
[quote=引用 7 楼 buyong 的回复:] system("/season/中文/hello");
这样不能执行把。。。 [/quote] 我试了能执行
max_min_ 2013-07-28
  • 打赏
  • 举报
回复
引用 9 楼 wangyaninglm 的回复:
[quote=引用 7 楼 buyong 的回复:] system("/season/中文/hello");
这样不能执行把。。。 [/quote] 可以的把!
 #include <stdlib.h>

       int system(const char *command);
system 需要的参数就是一个可执行的命令啊
一根烂笔头 2013-07-28
  • 打赏
  • 举报
回复
引用 2 楼 HuiyuYang_fish 的回复:
linux用system函数,我想问c库有这个函数吗?
有的!这是标准库里面的函数!在stdlib中
shiter 2013-07-27
  • 打赏
  • 举报
回复
引用 7 楼 buyong 的回复:
system("/season/中文/hello");
这样不能执行把。。。
shiter 2013-07-26
  • 打赏
  • 举报
回复
引用 2 楼 HuiyuYang_fish 的回复:
linux用system函数,我想问c库有这个函数吗?
怎么用?
Hony杨 2013-07-26
  • 打赏
  • 举报
回复
linux用system函数,我想问c库有这个函数吗?
shiter 2013-07-26
  • 打赏
  • 举报
回复
加载更多回复(5)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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