这是一个简单的程序,只执行三个孩子。每个将创建一个锁,读取一个文本文件,然后取消链接的链接。如果正确执行,则子进程将退出,进程ID转换为8位。如果程序无法创建/取消链接锁定,则它将尝试n_try次,并在两次调用之间随机睡眠一次。我对C和使用exec()相当陌生,所以我不确定我的程序出了什么问题。第一个子程序正确执行,但是之后的任何操作都会返回Bad address。我所做的就是复制确切的代码。一些帮助将不胜感激。这三个参数是文本文件的名称,创建/取消链接的尝试次数以及两次尝试之间的睡眠时间。谢谢!

上级:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void main(int argc, char *argv[]) {
    pid_t childpid1, childpid2, childpid3;
    char* fname = "lock";
    int fd, ret_val, status;
    pid_t  w;
    printf("I AM %d\n", (int)getpid());
    if ((childpid1 = fork()) == 0) { // If child 0
        execlp("./proj3b", "./proj3b", argv[1], argv[2], argv[3], "0", "lock");
    }
    printf("I AM %d FORKED CHILD %d\n", (int)getpid(), (int)childpid1);
    while ((w = waitpid(childpid1, &status, 0)) && w != - 1) {
        if (w != - 1)
            printf ("Wait on PID: %d return status of: %04X\n", w, status);
    }
    unlink(fname); // Unlink the lock to make sure nothing is left.
    // End of child 1
    printf("\nEND OF CHILD 0 \n\n");
    if ((childpid2 = fork()) == 0) { // If child 1
        execlp("./proj3b", "./proj3b", argv[1], argv[2], argv[3], "1", "lock");
        perror("Exec failure"); // Exec failed if this line is reached.
        exit(-1);
    }
    printf("I AM %d FORKED CHILD %d\n", (int)getpid(), (int)childpid2);
    while ((w = waitpid(childpid2, &status, 0)) && w != - 1) {
        if (w != - 1)
            printf ("Wait on PID: %d return status of: %04X\n", w, status);
    }

    unlink(fname);
    printf("\nEND OF CHILD 1 \n\n");
}


儿童:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void main(int argc, char *argv[]) {
    char *text;
    char *fname;
    int n_try, sleeptime, fd, k, ret_val, count = 0, status;
    pid_t pid;
    text = argv[1];
    n_try = atoi(argv[2]);
    sleeptime = atoi(argv[3]);
    k = atoi(argv[4]);
    fname = argv[5];
    pid = getpid();
    ret_val = (int) (pid % 256);
    srand((unsigned) pid);
    while ((fd = creat(fname, 0)) == -1 && errno == EACCES) {
        if (++count < n_try)
            sleep(rand()%sleeptime);
        else {
            printf ("\n Unable to generate.\n");
            kill(pid,0);
        }
    }
    if (!fork())
        execlp("/bin/cat", "cat", text, (char *) 0); // Reading text
    while (wait(&status) >= 0);
    while (unlink(fname)!=0)
        if (++count < n_try)
            sleep(sleeptime);
        else {
            printf ("\n Cannot release file\n");
            exit(-1);
        }
    exit(ret_val);
}

最佳答案

您在子级中正确终止了execlp的参数列表,但在父级中未正确终止。

关于c - 调用execlp()时出现“地址错误”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33506564/

10-11 15:46