我有以下代码:
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
文件.当你自己运行它时,它可以很好地工作.
你有竞争条件.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 ); }
学习如何通过进程间通信来阻止和发送信号留给提问者练习.