Tôi đang cố gắng mã hóa một chương trình theo dõi chính nó cho các cuộc gọi hệ thống. Tôi đang gặp khó khăn khi thực hiện công việc này. Tôi đã thử gọi một ngã ba() để tạo ra một thể hiện của chính nó (mã), sau đó theo dõi quá trình con kết quả.Cách theo dõi quy trình cho cuộc gọi hệ thống?
Mục tiêu là cho quá trình cha mẹ trả về chỉ mục của mọi cuộc gọi hệ thống được thực hiện bởi quá trình con và xuất nó ra màn hình. Bằng cách nào đó nó không hoạt động như kế hoạch.
Đây là mã:
#include <unistd.h> /* for read(), write(), close(), fork() */
#include <fcntl.h> /* for open() */
#include <stdio.h>
#include <sys/ptrace.h>
#include <sys/reg.h>
#include <sys/wait.h>
#include <sys/types.h>
int main(int argc, char *argv[]) {
pid_t child;
long orig_eax;
child = fork();
if (0 == child)
{
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
if (argc != 3) {
fprintf(stderr, "Usage: copy <filefrom> <fileto>\n");
return 1;
}
int c;
size_t file1_fd, file2_fd;
if ((file1_fd = open(argv[1], O_RDONLY)) < 0) {
fprintf(stderr, "copy: can't open %s\n", argv[1]);
return 1;
}
if ((file2_fd = open(argv[2], O_WRONLY | O_CREAT)) < 0) {
fprintf(stderr, "copy: can't open %s\n", argv[2]);
return 1;
}
while (read(file1_fd, &c, 1) > 0)
write(file2_fd, &c, 1);
}
else
{
wait(NULL);
orig_eax = ptrace (PTRACE_PEEKUSER, child, 4 * ORIG_EAX, NULL);
printf("copy made a system call %ld\n", orig_eax);
ptrace(PTRACE_CONT, child, NULL, NULL);
}
return 0;
}
Mã này được dựa trên mã này:
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/user.h> /* For constants
ORIG_EAX etc */
int main()
{
pid_t child;
long orig_eax;
child = fork();
if(child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl("/bin/ls", "ls", NULL);
}
else {
wait(NULL);
orig_eax = ptrace(PTRACE_PEEKUSER,
child, 4 * ORIG_EAX,
NULL);
printf("The child made a "
"system call %ld\n", orig_eax);
ptrace(PTRACE_CONT, child, NULL, NULL);
}
return 0;
}
Kết quả của một này là:
The child made a system call 11
mà là chỉ số cho cuộc gọi hệ thống exec.
Theo các trang người đàn ông cho wait():
All of these system calls are used to wait for state changes in a child
of the calling process, and obtain information about the child whose
state has changed. A state change is considered to be: the child terminated;
the child was stopped by a signal; or the child was resumed by
a signal.
Con đường tôi hiểu nó là mỗi khi một cuộc gọi hệ thống được gọi bởi một chương trình sử dụng, hạt nhân đầu tiên sẽ kiểm tra nếu quá trình này đang được truy tìm trước khi thực hiện thường trình gọi hệ thống và tạm dừng quá trình đó bằng tín hiệu và trả về điều khiển cho phụ huynh. Đó không phải là một sự thay đổi trạng thái rồi sao?
Chăm sóc để xây dựng? Bạn mong đợi điều gì sẽ xảy ra và điều gì thực sự xảy ra? Vui lòng chỉnh sửa câu hỏi để thêm nó, không phải là nhận xét. –
Bên cạnh đó, điều đầu tiên bạn làm trong tiến trình cha mẹ là gọi 'wait'. Hàm này thực hiện chính xác điều đó, đợi cho đến khi quá trình con hoàn thành, có nghĩa là cuộc gọi 'ptrace' cố gắng theo dõi một tiến trình không còn tồn tại nữa. –
[Tham khảo] [1] Tôi nghĩ, điều đó có thể hữu ích. [1]: http://stackoverflow.com/questions/6468896/why-is-orig-eax-provided-in-addition-to-eax –