使用c我该如何等待PID X退出,当它不是我当前进程的孩子?
Kill(pID,SIGTERM); waitpID(pID,NulL,0);
以上不起作用,因为'PID'不是一个subprocess。
如果我有一个不受 *** 作系统版本支持的API的Dllimport(C#.NET),会发生什么情况
OpenfileDialog文件名为UTF8
在linux上从C调用C#
在linux上运行.NET Core – 什么都不写
实现一个外部函数接口的指南
通过混沌看到这个答案 :
通常的做法是使用kill(0,pID)进行轮询,然后查找ESRCH的返回值-1和errno,以指示进程已经消失
基于kill的手册页 ,它可能会被kill(pID,0) 。 但是这个想法是一样的。
以一种干净的方式(即没有时间间隔轮询,并且没有PID溢出的风险)这样做的唯一方法是使用Netlink cn_proc连接器(这是特定于linux的)。 没有太多的示例代码或文档。 这不是一个很好的API,但基本上这只是一个明智的API。
查找PROC_EVENT_EXIT,这是您感兴趣的事件。
http://Google.com/codesearch?q=PROC_EVENT_EXIT&hl=en&btnG=Search+Code
这是工作示例如何订阅和使用PROC_EVENT_EXIT / PROC_EVENT_FORK事件。 测试内核3.3.8
#include <sys/types.h> #include <sys/socket.h> #include <linux/netlink.h> #include <linux/connector.h> #include <linux/cn_proc.h> #include <stdio.h> #include <unistd.h> #include <strings.h> #include <errno.h> #define NL_MESSAGE_SIZE (sizeof(struct nlmsghdr) + sizeof(struct cn_msg) + sizeof(int)) static int nl_sock; int connect_to_netlink() { struct sockaddr_nl sa_nl; /* netlink interface info */ char buff[NL_MESSAGE_SIZE]; struct nlmsghdr *hdr; /* for telling netlink what we want */ struct cn_msg *msg; /* the actual connector message */ /* connect to netlink socket */ nl_sock = socket(PF_NETlink,SOCK_DGRAM,NETlink_CONNECTOR); if (-1 == nl_sock) { perror("socket Failed"); return errno; } bzero(&sa_nl,sizeof(sa_nl)); sa_nl.nl_family = AF_NETlink; sa_nl.nl_groups = CN_IDX_PROC; sa_nl.nl_pID = getpID(); if (-1 == bind(nl_sock,(struct sockaddr *)&sa_nl,sizeof(sa_nl))) { perror("bind Failed"); return errno; } /* Fill header */ hdr = (struct nlmsghdr *)buff; hdr->nlmsg_len = NL_MESSAGE_SIZE; hdr->nlmsg_type = NLMSG_DONE; hdr->nlmsg_flags = 0; hdr->nlmsg_seq = 0; hdr->nlmsg_pID = getpID(); /* Fill message */ msg = (struct cn_msg *)NLMSG_DATA(hdr); msg->ID.IDx = CN_IDX_PROC; /* Connecting to process information */ msg->ID.val = CN_VAL_PROC; msg->seq = 0; msg->ack = 0; msg->flags = 0; msg->len = sizeof(int); *(int*)msg->data = PROC_CN_MCAST_ListEN; if (-1 == send(nl_sock,hdr,hdr->nlmsg_len,0)) { perror("send Failed"); return errno; } return 0; } voID handle_events() { char buff[CONNECTOR_MAX_MSG_SIZE]; struct nlmsghdr *hdr; struct proc_event *event; fd_set fds; while (1) { FD_ZERO(&fds); FD_SET(nl_sock,&fds); if (0 > select(nl_sock + 1,&fds,NulL)) { perror("select Failed"); return ; } /* If there were no events detected,return */ if (! FD_ISSET(nl_sock,&fds)) { return ; } /* if there are events,make calls */ if (-1 == recv(nl_sock,buff,sizeof(buff),0)) { perror("recv Failed"); return ; } hdr = (struct nlmsghdr *)buff; if (NLMSG_ERROR == hdr->nlmsg_type) { perror("NLMSG_ERROR"); } else if (NLMSG_DONE == hdr->nlmsg_type) { event = (struct proc_event *)((struct cn_msg *)NLMSG_DATA(hdr))->data; switch(event->what) { case proc_event::PROC_EVENT_EXIT: printf("Process %d (tgID %d) exit with code %d,signal %dn",event->event_data.exit.process_pID,event->event_data.exit.process_tgID,event->event_data.exit.exit_code,event->event_data.exit.exit_signal); break; case proc_event::PROC_EVENT_FORK: printf("New process %d (tgID %d),parent %d (tgID %d)n",event->event_data.fork.child_pID,event->event_data.fork.child_tgID,event->event_data.fork.parent_pID,event->event_data.fork.parent_tgID); break; default: break; } } } } int main(int argc,char *argv[]) { if (!connect_to_netlink()) { handle_events(); } return 0; }
编译并运行:
# g++ -o psev psev.cpp # ./psev
输出:
New process 27465 (tgID 27465),parent 2351 (tgID 2351) Process 27465 (tgID 27465) exit with code 0,signal 17
总结以上是内存溢出为你收集整理的如果X不是subprocess,我该如何等待PID X退出?全部内容,希望文章能够帮你解决如果X不是subprocess,我该如何等待PID X退出?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)