"Bad Address" 调用 execlp()
"Bad Address" on calling execlp()
这是一个简单的程序,只需执行 3 children。每个人都会创建一个锁,读取一个文本文件,然后解除锁的链接。如果正确执行,child 将退出,并将其进程 ID 转换为 8 位。如果未能 create/unlink 锁定,该程序将尝试 n_try
次,并在两者之间随机休眠一段时间。我对 C 和使用 exec() 还很陌生,所以我不确定我的程序出了什么问题。第一个 child 正确执行,但之后的任何东西都会 return 一个 Bad address
。我所做的只是复制确切的代码。一些帮助将不胜感激。这三个参数是文本文件的名称、create/unlink 锁定的尝试次数以及两次尝试之间的休眠时间。谢谢!
Parent:
#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");
}
Child:
#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
的参数列表,但在父项中没有。
这是一个简单的程序,只需执行 3 children。每个人都会创建一个锁,读取一个文本文件,然后解除锁的链接。如果正确执行,child 将退出,并将其进程 ID 转换为 8 位。如果未能 create/unlink 锁定,该程序将尝试 n_try
次,并在两者之间随机休眠一段时间。我对 C 和使用 exec() 还很陌生,所以我不确定我的程序出了什么问题。第一个 child 正确执行,但之后的任何东西都会 return 一个 Bad address
。我所做的只是复制确切的代码。一些帮助将不胜感激。这三个参数是文本文件的名称、create/unlink 锁定的尝试次数以及两次尝试之间的休眠时间。谢谢!
Parent:
#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");
}
Child:
#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
的参数列表,但在父项中没有。