当前位置:  开发笔记 > 编程语言 > 正文

C - 使用fork()和exec()两次

如何解决《C-使用fork()和exec()两次》经验,为你挑选了1个好方法。

我有以下代码:

int main(int argc, char **argv)
{
    char    *program;
    char     stringa[1000] = "";
    int num = 123;
    char snum[10];

    if (argc != 2) {
        printf("Usage: mon fileName\n where fileName is an executable file.\n");
        exit(-1);
    } else {
        program = argv[1];
        sprintf(stringa, "./%s", program);

        pid_t pid = fork();
        if (pid < 0 ) {
            perror("fork failed."); 
            exit(1); }

        else if (pid == 0) {
            char* args[] = {stringa, NULL};
            execv(args[0], args);
        }
        else {

            char procmon_str[] = "./procmon";
            num = pid;
            sprintf(snum, "%d",num);
            pid_t pid2 = fork();
            if (pid2 == 0) {
                char* args2[] = {procmon_str, snum, NULL};
                execv(args2[0], args2); }
            else {

                printf("PID of child is %s", snum);
                int parent_pid = getpid(); 
                printf("PID of parent is %d", parent_pid);}

        }}
    wait(NULL);

    return 0;
}

这个程序的名称是myProgram.我在shell中提供的参数是:

./myProgram calc

calc是我想要使用的另一个程序myProgram. myProgram然后执行calc,获取并将其PID传递PID给另一个调用procmon它的程序; 这就是为什么我需要分叉两次.但是,当我运行上面的代码时,我得到:

procmon: cannot open /proc/6225/stat, the monitored process is not running anymore.

我怎样才能解决这个问题?

怎么calc办? 它进入一个for循环,增加一个int变量并进入睡眠状态3秒并重复10次.所以它应该运行大约30秒.

怎么procmon办? procmon只需接收一个PID进程作为参数并显示相应的/proc/PID/stat文件.当你自己运行它时,它可以很好地工作.



1> Rob K..:

你有竞争条件.fork()在calc子进程完成执行并退出之前,您无法保证第一个实际甚至返回到父进程.您需要同步流程的执行.

关于在哪里阻止和发信号的ETA建议

if (pid == 0) 
{
    // block here waiting for the go-ahead from parent
    char* args[] = { stringa, NULL };
    execv( args[ 0 ], args );
}

......

else
{
    // signal calc child here 
    printf( "PID of child is %s", snum );
    int parent_pid = getpid();
    printf( "PID of parent is %d", parent_pid );
}

学习如何通过进程间通信来阻止和发送信号留给提问者练习.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有