मैं ऐसे प्रोग्राम को कोड करने का प्रयास कर रहा हूं जो सिस्टम कॉल के लिए खुद को ढूंढता है। मुझे यह काम करने में मुश्किल हो रही है। मैंने खुद को एक उदाहरण बनाने के लिए एक कांटा() को कॉल करने का प्रयास किया, फिर परिणामस्वरूप बाल प्रक्रिया की निगरानी करें।सिस्टम कॉल के लिए प्रक्रिया का पता लगाने के लिए कैसे?
लक्ष्य मूल प्रक्रिया के लिए बाल प्रक्रिया द्वारा किए गए प्रत्येक सिस्टम कॉल की अनुक्रमणिका को वापस करने और स्क्रीन पर आउटपुट करने के लिए है। किसी भी तरह से यह योजना के रूप में काम नहीं कर रहा है।
#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;
}
इस कोड को इस कोड पर आधारित था::
#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;
}
इस एक के उत्पादन में है:
यहाँ कोड है
The child made a system call 11
जिसके लिए सूचकांक है निष्पादन प्रणाली कॉल।
प्रतीक्षा के लिए आदमी पृष्ठ() के अनुसार:
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.
तरह से मैं समझता हूँ कि यह है कि हर बार जब एक सिस्टम कॉल एक उपयोगकर्ता प्रोग्राम के द्वारा उत्पन्न होता है, कर्नेल पहले अगर प्रक्रिया किया जा रहा है निरीक्षण करेंगे सिस्टम कॉल रूटीन और विराम को निष्पादित करने से पहले पता लगाया गया है जो सिग्नल के साथ प्रक्रिया करता है और माता-पिता को नियंत्रण देता है। क्या यह पहले से ही एक राज्य परिवर्तन नहीं होगा?
विस्तृत करने के लिए परवाह? आप क्या होने की उम्मीद करते हैं, और वास्तव में क्या होता है? टिप्पणी जोड़ने के लिए कृपया इसे जोड़ने के लिए प्रश्न संपादित करें। –
इसके अलावा, आप मूल प्रक्रिया में पहली चीज करते हैं, 'प्रतीक्षा' को कॉल कर रहे हैं। यह फ़ंक्शन बिल्कुल ठीक है, बच्चे की प्रक्रिया समाप्त होने तक प्रतीक्षा करें, जिसका अर्थ है कि 'ptrace' कॉल ऐसी प्रक्रिया का पता लगाने की कोशिश करता है जो अब मौजूद नहीं है। –
[इसे देखें] [1] मुझे लगता है, यह मदद कर सकता है। [1]: http://stackoverflow.com/questions/6468896/why-is-orig-eax-provided-in-addition-to-eax –