【问题标题】:How to get information from child process如何从子进程中获取信息
【发布时间】:2013-10-26 17:40:26
【问题描述】:

我想写一个程序来执行这个命令:

gcc -c file1 file2 file3 ...

程序必须创建子进程,每个子进程将编译一个文件。我在子进程中使用了这个命令:

execlp("gcc","gcc","-c","-Wall",argv[i],NULL);

到目前为止一切顺利。问题是如果编译文件时出现错误,父进程必须打印出错误的文件名。这是打印文件名的父级的条件。

我的解决方案是创建一个包含子 pid 和它编译的文件名的表。父母将等待其孩子结束。在孩子结束时,我们查看孩子是否正常终止(它返回 0)。如果不是,我们在表中搜索以找到它使用他的 pid 处理的文件名。

我正在寻找另一种解决方案。我不知道是否有办法将文件名发送到父进程。当然,只有在该文件中有错误时我们才会这样做。

谢谢。

【问题讨论】:

    标签: c exec parent-child


    【解决方案1】:

    听起来您需要创建一个任务队列。即创建工作线程来完成某些任务,然后离开。如果是这样,方法是 described here

    但您真正的问题是关于在线程之间来回传递数据。函数 CreateThread 包含一个参数 LPVOID lpParameter,它就是为了实现这种能力而包含的。它是一个 void *,因此它将接受任何变量类型,包括指向数组的指针、指向结构的指针等。这允许您根据需要来回传递尽可能多或尽可能少的数据。

    下面的代码 sn-p 传递一个指向数据数组的指针。这将是您感兴趣的部分

    这里是创建线程的部分

        hThreadArray[i] = CreateThread( 
            NULL,                   // default security attributes
            0,                      // use default stack size  
            MyThreadFunction,       // thread function name
            pDataArray[i],          // argument to thread function 
            0,                      // use default creation flags 
            &dwThreadIdArray[i]);   // returns the thread identifier 
    

    寻找将接收和传递数据的工作函数MyThreadFunction

    这是complete, build-able code

    对于 posix

    pthread_create() 还包含可通过的数据:
    int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); in void *arg
    可以使用最后一个参数将参数传递给线程,就像在 windows 版本中一样。你想要做的还有一个函数pthread_join(),原型:
    int pthread_join(pthread_t th, void **thread_return);
    该函数在被调用的线程(第一个参数线程句柄)结束时用作处理程序。当线程退出时,pthread_join 中的最后一个参数可以接收数据。这些数据可能对您声明的目的有用。

    【讨论】:

    • 对不起,我忘了说我的程序是c而不是c++,我必须使用POSIX标准
    • 哦,这改变了一切,不是吗?
    • @rabahRachid - 添加了一些关于 POSIX 的注释。 pthread_join() 通过 void **arg。应该提供方法来做你需要的。
    • 谢谢我去看看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多